• 締切済み

canvasで作成した画像をperlでアップロード

恐れ入ります。 function upImg() { var base64 = board1.toDataURL('image/png'); var request = { url: 'https:~canvas.cgi', method: 'POST', params: { image: base64.replace(/^.*,/, '') }, success: function (response) { console.log(response.responseText); } }; Ext.Ajax.request(request); } として、perlで送信された画像データを受け取ってサーバーの任意のディレクトリに保存をしたいのですが、方法が分かりません。 perl側では、単純に open(OUT, ">./upload/gazouURL"); binmode(OUT); while(read($fileName, $buffer, 1024)) { print OUT $buffer; } close(OUT); としています。$fileNameとして受け取るパラメータはjavascriptからどのように送信されているのでしょうか。ご教授いただけたらありがたいです。よろしくお願いいたします。

  • Perl
  • 回答数1
  • ありがとう数1

みんなの回答

回答No.1

この場合perlはあまり関係なくてブラウザから Webサーバーが何を受け取るか?だけですね。 https://www.yoheim.net/blog.php?q=20171201 中身はこういう形式の、 マルチパートフォームデータというものになります。 params: { image: base64.replace(/^.*,/, '') }, ここが、まだまだ追加可能な形式をしているのはこのためで、 画像のほか同時に変数などの値や、文字などを 複数混ぜて同時に送れます。 なのですが、そこでbase64がやっかいで。 これはバイナリデータをテキストにしている (6ビットスライドデータ) こいつの関係で送信データが1.5倍程度に膨れ上がります。 非力なサーバーで画像送信が遅いかエラーがでるのは このためです。 で、Webサーバーが受け取った後は、 自動的に分解され、テンポラリファイルに格納してあり、 そのテンポラリがPerlに来てるという具合です。 が、このソースどっちもOUTじゃない??? ただ送り返すだけ(実体ファイルは別途作られてるようだが) ブラウザでファイル選択して、 「送らず」に送ったことにして出来上がったテキストデータを、 画像であるimgオブジェクトにすると、送らずに開けますよ^^ で、それをCanvasにすれば、ファイル選択->Canvasに取り込み は、ブラウザ内で完結できますよ~(ただし、CORSに注意) で、何らかの経路を使った後、完成したら それを送り出せばいいんじゃないかな~って 感じた(何がしたいのかは、知らないので。違う話ならごめん)

spider32
質問者

お礼

ご回答ありがとうございます。ajaxやjavaは無知なもので、大変申し訳ありません。パラメータをperlにどのように飛ばしたらよいでしょうか。具体的な記述などがお分かりであればご教授いただけるとありがたいです。params:{の中にnameと送信する文字列を指定するような感じですが、まったく動作しないです。ちなみに、perl側でwhile(read($fileName, $buffer, 1024))の部分の$filenameに受け取ったパラメータを格納したい感じです。例えば、ファイル名としてcanvas.pngみたいなものをパラメータとして受け取って、canvas.pngが飛んで来たらアップロードするみたいなイメージです。よろしくお願いいたします。

関連するQ&A

  • perlでCSV形式ファイルのアップロード

    本日、同じ質問をしたものです。 前回の問題は解決したのですが、ファイルがアップロードできないで悩んでします。 CGIのプログラムは以下のソースです。 #! c:/perl/bin/perl use CGI; # CGIヘッダーの出力 print "Content-type: text/html\n\n"; my ($query,$fileName); $query = new CGI; $fileName = $query->param('fileName'); open(OUT, ">./a.csv"); binmode(OUT); while(read($fileName,$buffer,1024)) { print OUT $buffer; } close(OUT); close($fileName); #ファイルハンドルをcloseしています。 exit ; ファイルは、作られるのですが、中身が書き込まれません。 どなたか教えてください。 お願いします。

    • ベストアンサー
    • Perl
  • perl Image::Magick

    恐れ入ります。perlでImage::Magickで画像の処理をしているのですが、画像によって途中までしか変換されていなかったりする画像(下部分が灰色)のものが出ます。この原因と対策をご存じの方はいらっしゃいますか? $filename = "./folder/image.jpg"; $filename 2= "./folder2/image.jpg"; $image = Image::Magick->new; $image->Read("$filename"); $width = $image->Get('width'); $height = $image->Get('height'); $image -> Set( quality => 60 ); $image->Write("$filename2"); 以上のようにしています。HTMLからファイルを受け取る部分は、 my ($query,$fileName); $query = new CGI; $fileName = $query->param('fileName'); open(OUT, ">./folder/image.jpg"); binmode(OUT); while(read($fileName, $buffer, 2048)) { print OUT $buffer; } としています。HTMLからのアップロードは、対象フォルダの画像を確認した場合問題無くアップされています。以上よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • cgi(perl)でアップロードされたファイルを保存する方法について

    ファイルをアップロードするフォーム"form.html"(method="POST" action="/cgi-bin/form.cgi")を書きました。 ファイルを保存する方法について疑問があるので教えて下さい。 http://www.ss.iij4u.or.jp/~somali/web/_perl_upload.html 上記URLを参考にしました。 下記の変数"$filename"には、アップロードしたファイル名(image.jpgなど)が入っています。 (アップロードされたファイル名と保存するファイル名を同じにしました。) #------------------------------------------------------------ open (OUT, ">$filename") || die "cannot open"; binmode (OUT); $i=1;#ループ回数とアップロードされたファイルのサイズの比較の為。 while(read($filename, $buffer, 1024)){ print OUT $buffer; $i++; } close (OUT); close ($filename) if ($CGI::OS ne 'UNIX'); # Windowsプラットフォーム用 print "whileループの数: $i<BR>"; #------------------------------------------------------------ while文について。 while(read($filename, $buffer, 1024)){ print OUT $buffer; 上記の2行は、1024バイトづつ$filename(アップロードしたファイル名)から読み込み、$bufferに格納。 $bufferに格納されたデータをOUTで指定した部分に書き込む、そしてそれを繰り返す。 こう理解していますが間違いないでしょうか? ファイルサイズが予想できれば、whlie文を使わずに read($filename,$temp,10000); print OUT $temp; このようにしても問題ありませんか? read関数について教えて下さい。 書籍などには、 read(FILEHANDLE,$data,1024); こう書いてありますが、上記例でFILEHANDLEを変数名$filenameにしても問題なく動作しました。 FILEHANDLEでなく、変数$filenameでも問題無いのでしょうか? FILEHANDLEと$filenameは何を示しているんですか? ファイルの先頭アドレスでしょうか? $filenameにはアップロードしたファイル名が入っているのにどうして動くのだろうと疑問に思っています。 乱文で申し訳ありませんがご教授下さい。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • perl アップロード

    http://hole.sugutsukaeru.jp/archives/10 こちらのサイトでPerlでのファイルのアップロードを行なおう思い、 作成しているのですが、 エラーになり表示されません。 コードを貼り付けると、 #!/usr/bin/perl -w #使用するモジュールをロード use File::Basename; use CGI; #変数宣言 my ($form, $dir, $filename, $parsename, @filename, $error, $ok, $type, $newfile, $i, $buffer, @ext_ok); #ファイルを保存するディレクトリを設定 #(CGIの実行ユーザで書き込み権限が必要) $dir = './files'; #受付可能な拡張子(正規表現) @ext_ok = qw ( txt zip pdf doc cgi ); #CGIオブジェクトを作成 $form = new CGI; #転送できるファイルの最大サイズを設定 #(実際は、post送信されるコンテンツ合計の最大サイズ) #この値は、CGIオブジェクトを作成する時には既に #設定されていなければならない $CGI::POST_MAX = 1024 * 1000; #max = 1MB #CGIオブジェクトを作成 $form = new CGI; #クライアントにヘッダを送信 #これは、結果メッセージ表示のため binmode STDOUT; print "Content-Type: text/plain;charset=euc-jp\r\n\r\n"; #ファイルの転送のチェック if (!defined($filename) and $error = $form->cgi_error){ #ファイルが転送されていなかったら、$filename は 未定義値となっている。 #フォーム上でファイルを選択しないままフォームがサブミットされた場合は、 #通常はこの変数 $filename は空文字列として定義されている(=未定義ではない)。 #このため、以前のバージョンでは $filename が定義されている #かどうかをエラーの判別の基準としていたが、 #2007年3月 Mac OS X 上の Netscape 7.1 で試したところ、 #ファイル選択されていない場合に未定義値になることが判明。 #このため、エラーの場合に設定される(筈の)値 $form->cgi_error も判別の #基準に追加した。 print "ファイルが転送できませんでした:$error\n"; exit; } if ($filename) { #ファイルが転送されていれば、値は真 #ファイルパス内の「\」を「/」に変換 # $parsename には、送信元クライアントマシン内での #ファイルパスが格納されている。 #注:Shift_JISで実装する場合、このあたりには工夫が必要。 $parsename =~ s#\\#/#g; #ファイル名を(ベース名, ディレクトリ名, 拡張子)に分解 @filename = fileparse($parsename, "\.[^\.]+"); #ベース名のチェック(アスキー文字列であること) $filename[0] =~ /^[\.\w~-]+$/ and $filename[2] =~ /^[\.\w-]+$/ and $ok = 1; unless ($ok) { $error = 'ファイル名は、半角英数字にして下さい。'; print "ファイル転送ができませんでした。: $error\n"; exit; } $ok = 0; #フラグのリセット #拡張子のチェック foreach (@ext_ok){ $filename[2] =~ /^\.$_$/ and $ok = 1 and last; } unless ($ok){ $error = "許可されていない拡張子($filename[2])です。"; print "ファイル転送ができませんでした。: $error\n"; exit; #サーバ側ファイル名の決定 #まず、セッションごとに一意のディレクトリ名を作成 while (-d "$dir") { $dir = $dir.'/upload_'.&gen_unique_key(15); } #ファイルを格納するディレクトリを作成 unless (mkdir($dir, oct(777))){ print "保存ファイル用ディレクトリの作成に失敗しました。: $!\n"; exit; #サーバ側のファイルパスを設定 $newfile = $dir."/".$filename[0].$filename[2]; #既に同名のファイルが存在した場合 #(複数の同名ファイルを同時にアップロードした場合など)は、 #ベース名にアンダースコアと番号を付けて別名にする $i = 0; while (-f "$newfile"){ $i++; $newfile = $dir."/".$filename[0]."_".$i.$filename[2]; } #ファイルの保存 unless (open (OUTFILE,">$newfile")){ print "サーバ側の保存ファイルの作成に失敗しました。: $!\n"; exit; } #保存用ファイルを無事 open できた場合 #改行コードの自動変換を停止 binmode (OUTFILE); binmode ($filename); # $filename から内容を読み出して #保存用ファイルに書き出す #この場合、変数 $filename はファイルハンドルとして #機能する while (read($filename,$buffer,1024)) { print OUTFILE $buffer; #ファイルを close して終了メッセージを表示 #この場合、$filename は、送信元クライアント #マシン内でのファイルパス(ブラウザが送信してきた値)を返す close (OUTFILE) and print "送信されたファイル ($filename) を右のファイル名で保存しました: $newfile\n" or print "サーバ側の保存ファイルのクローズに失敗しました。: $!\n"; } else { # ファイルが転送されていない場合 # $filename は 偽 print "ファイルはアップロードされていません。\n"; } #一意の文字列を作成するための関数 sub gen_unique_key($){ #生成する文字列の長さを引数で指定 my $length = shift; my ($i, $tempval, $key, $chars, @chars); #引数で指定された文字列長さが、 # 5以上 30以下の数値でない場合、15に設定 #(範囲は、長からず短からず...。) ($length =~ m/^\d+$/ and $length >= 5 and $length <= 30 ) or $length = 15; #使用する文字を指定(ディレクトリ名として使用できる文字を指定する) $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890~-_'; @chars = split(//, $chars); #乱数のタネを作る srand(time|$$); for ($i=0; $i<$length; $i++){ # @chars 配列の最大の添字までの乱数を生成する $tempval = int(rand(scalar(@chars))); $key .= $chars[$tempval]; } return $key; } となりますが、どこが間違えているのでしょうか。 上記コードは、サイトからのコピペになります。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • tmhOAuthでtwitterに画像投稿

    tmhOAuthとTwitterAPIを使ってサーバーに保存してある画像をtwitterに投稿したいと考えています。 tmhOAuthを使ってつぶやき(文字列)の投稿は成功しています。 画像の投稿になるとうまく行きません。ウェブ上で情報を探せるだけ探して数日間トライしてみましたが、どれも成功には至りませんでした。 「開発環境」 PHP:5.5 Cakephp:2.5 function test(){ $twConf = array( 'consumer_key' => 'xxxxxxxxxxxxxxxxxxxxxxx', 'consumer_secret' => 'xxxxxxxxxxxxxxxxxxxxxxx', 'user_token' => 'xxxxxxxxxxxxxxxxxxxxxxx', 'user_secret' => 'xxxxxxxxxxxxxxxxxxxxxxx', 'curl_ssl_verifypeer' => false, ); $tmhOAuth = new tmhOAuth($twConf); $image ='http://www.example.com/img/test.jpg'; $message='hoge hoge'; $params = array( 'media[]' => "@{$image}", 'status' => "{$message}" ); $code = $tmhOAuth->request('POST', $endpoint, $params, true, true); if ($tmhOAuth->response["code"] == 200){ var_dump($tmhOAuth->response["response"]); } else { var_dump($tmhOAuth->response["error"]); } } このソースを実行するとエラーレスポンスが返らずに$codeの中身は403となります。 (何かのエラーが返ってきているようです) 上記のやり方以外にも ---------------------------------------------------------------- $file = 'http://www.example.com/img/test.jpg'; $image = file_get_contents( $file ); $imagesize = getimagesize( $file ); $content_base64 = base64_encode($image); $api_url = 'https://api.twitter.com/1.1/statuses/update_with_media.json'; $params = array( 'status' => $message, 'media[]' => $content_base64 . ";type=" . $imagesize['mime'] . ";filename=" . basename( $file ), ); ---------------------------------------------------------------- という方法を行ってみましたが、エラーが「0」という形で返ってきてしまいます。 twitter developersのwebsite・Callback URLは自分のドメイン名を設定しています。アクセスレベルは「Read and write」です。 文字の投稿はできているので、$params 周辺の記載に問題があると考えています。 TwitterAPI関係に詳しい方がおられましたら、よい方法を教えていただければと思います。 宜しくお願い致します。

    • 締切済み
    • PHP
  • javascriptでの値の取得について

    すごく素人だと思うのですが。 この手のタイプで得られる値を外部で取得できないのでしょうか? 戻り値で返すわけにもいかないですし、よく理解できていません var val: ○.○=function(){ここで得た値をvalに入れたい} 例1 var target; ・・・ request.onreadystatechange=function(){ if(request.readyState==4 && request.status==200){ //target=request.responseText;みたいなことをしたい } } 例2 var width,height; ・・・ image.onload=function(){ //width=image.width; height=image.height;みたいなことをしたい }

  • perlでCSV形式ファイルのアップロード方法

    perlでCSV形式ファイルのアップロード方法を教えてさい。 htmlで <HTML> <BODY> <FORM action="excel読み込み.cgi" enctype="multipart/form-data" method="post"> フレアシステムのファイル: <INPUT type="file" name="upload_file" size="60"><BR> <INPUT type="submit" value="読み込み"> </FORM> </BODY> </HTML> として、ファイル名の指定をして、読み込みボタンを押すと、excel読み込み.cgiを呼び出すのですが、プログラムの内容が表示されるだけで終わってしまいます。 excel読み込み.cgiのプログラムは以下の内容です。 #! c:/perl/bin/perl use CGI; $query = new CGI; $filename = $query->param('upload_file'); while(read($filename, $buffer, 2048)) { $file .= $buffer; } @files = split(/\\/, $filename); ($basename, $exp) = split(/\./, $files[-1]); $new_file = $basename . "." . $exp; # ファイルを指定ディレクトリにコピー #open(OUT, "> c:\\foo\\$new_file"); open(OUT, "> c:\\$new_file"); binmode(OUT); print(OUT $file); close(OUT); print "Content-type: text/html\n\n"; print "[$basename] [$exp]\n"; print "正常終了\n"; exit; CGIのプログラムを色々と調べて、別のないようにしても同じようにプログラムがそのまま表示されてしまいます。 どなたか教えてください。 宜しくお願いします。

  • javascriptで困っています。教えてください

    html5でcanvasに描いた画像をsave_buttonを押してlocalStorageで保存して、それをload_buttonをおして読み込もうとしているのですが、うまくいきません。 canvas.toDataURL();でデータを6bit毎に分割できています。 それを保存して、 var base64 = window.localStorage.getItem("saveKey");で読み込むこともできています。 その後canvasに描画できません。 よろしくお願いします。 var canvas = document.getElementById("myCanvas"); $("#save_button").click(function () {    // Canvasからbase64エンコーディングされた画像データを取得する var canvas = document.getElementById("myCanvas"); var base64 = canvas.toDataURL(); // LocalStorageに保存する window.localStorage.setItem("saveKey", base64); }); $("#load_button").click(function () { // LocalStroageからデータを取得する var base64 = window.localStorage.getItem("saveKey"); // Imageオブジェクトを作成し、src属性にデータを設定する var image = new Image(); image.src = base64; image.onload = function(){ // 画像の読み込みが終わったら、Canvasに画像を反映する。 canvas.drawImage(image, 0, 0); } });

  • Perlでの一括アップロード

    同じファイルを違うファイル名で一括でアップロードしたいのですが。 最初の一つしか正常にアップされません。 残りのファイルは正しいファイル名で作成はされるのですが、0バイトの状態です。 原因としてはファイルを書き込む Whileの中のprintしている部分かと思われます。 ちなみにバイナリデータも取得できています。 *このソースはファイルのアップ部分だけで、 実際にはforeachの中で関数として呼ばれています。 エラー関数や、モジュールの呼び出し部分は省略しています。 仕様モジュールCGI.pm ソースは以下のとおりです。 ご教授の方よろしくお願いいたします。 # 最大許容サイズ(KByte) my $maxsize = 300; # 保存先ディレクトリ my $logfiles = "./file"; # アップロードを許可するファイルの種類 my %hash_mime = ( 'text/html' => 'html', 'image/jpeg' => 'jpg', 'image/pjpeg' => 'jpg' ); # ファイル取得 my $fH = $query->upload('filename'); # エラーチェック if ($query->cgi_error) { my $err = $query->cgi_error; &error("$err") if ($err); } &error("File transfer error.") unless (defined($fH)); # MIMEタイプ取得 my $mimetype = $query->uploadInfo($fH)->{'Content-Type'}; # 保存するファイル名を取得 my $set = &set_name($mimetype); # ファイル保存 my ($buffer); open (OUT, ">$logfiles/$set") || &error("Can't open $set"); binmode (OUT); while(read($fH, $buffer, 1024)){ print OUT $buffer; } close (OUT); close ($fH) if ($CGI::OS ne 'UNIX'); chmod (0666, "$logfiles/$set");

    • ベストアンサー
    • Perl
  • perlで画像をダウンロードしようと思っています

    gazou_element.txtにurlを保存していて、それらを一つずつ取り出してダウンロードするようにしようとしているのですがError:Invalid argument at C:User~~~となってしまいます。 どうすればいいかよろしければお教え下さい。 use Encode; use LWP::UserAgent; use IPC::Open2; use warnings; $file = "gazou_element.txt"; open (IN, $file) or die "$!"; my @url =<IN> ; my $time = time; for(my $i = 0; $i < scalar(@url); $i++){ my $request = HTTP::Request->new('GET', $url[$i]); my $ua = LWP::UserAgent->new; $ua->agent('Mozilla/4.0'); my $response = $ua->request($request); my $prefix = get_prefix($url[$i]); my $count = $i + 1; if($response->is_success){ open($OUT, ">","$time$i$prefix") or die("Error:$!"); binmode $OUT; print $OUT $response->content; close $OUT; }else{ } } #拡張子を取得する sub get_prefix{ my $url = shift; my $start = rindex($url, "."); my $end = length($url); my $string = substr($url, $start, $end - $start); return $string; }

専門家に質問してみよう