Perlでuse socketを使用してファイルを送信

このQ&Aのポイント
  • Perlでuse socketを使用してファイルを送信する方法について教えてください。
  • ファイルを送るためには、どのように書けばよいのでしょうか?htmlで表現すると、複数のファイルをpostで送信したいです。
  • socketを使用してテキストデータを送信することはできたので、ファイルの送信方法を教えてください。
回答を見る
  • ベストアンサー

Perlでuse socketを使用してファイルを送信

Perlでuse socketを使用してファイルを送信する方法を教えてください。 先日、別サーバーのcgiへデータを送信する方法をここで質問し、socketを教えていただきました。 ■質問 http://oshiete1.goo.ne.jp/qa3344300.html ■回答で紹介されたQ&A http://oshiete1.goo.ne.jp/qa2808695.html この方法でテキストデータは、data1=abcdのように書くことで送信ができました。 ファイルを送る場合は、どのように書けばよいのでしょうか? htmlで表現すると、以下のように複数のファイルをpostで送信したいのです。 <input type="file" name="data1"> <input type="file" name="data2"> よろしくお願いします。

  • CGI
  • 回答数1
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

すみません、この前答えたの私ですが、multipartのデータを送るんでしたね。 基本的には、 http://oshiete1.goo.ne.jp/qa2808695.html なんですが、Content-Typeの指示と、$dataの中身が違います。 上記に付け加えてみました。 以下でどうでしょうか。 エラーチェックはしてません。 考え方は正しいと思いますが、とりあえずチェックしていないので・・・ #!/usr/local/bin/perl use strict; use CGI::Carp qw(fatalsToBrowser); use CGI; use Socket; my $host = "http://www.サーバーB.jp"; my $path = "Server_B.cgi"; my $file="c:\data.bin"; #バイナリデータ読込み my $fdata; open(IN,$file); read(IN, $fdata, -s($file)); close(IN); #送信データ作成 my $boundary = "----------boundary"; my $data; #バイナリデータ $data.="--$boundary\r\n"; $data.="Content-Disposition: form-data; name=\"file\"; filename=\"$file\"\r\n\r\n"; $data.=$fdata."\r\n"; ##他にもバイナリデータがある場合($file2を$fdata2に読んでいた場合) #$data.="--$boundary\r\n"; #$data.="Content-Disposition: form-data; name=\"file\"; filename=\"$file2\"\r\n\r\n"; #$data.=$fdata2."\r\n"; ##他にも通常変数がある場合(aaa=123を渡す場合) #$data.="--$boundary\r\n"; #$data.="Content-Disposition: form-data; name=\"aaa\"\r\n\r\n"; #$data.="123\r\n"; #終わりマーク $data.="--$boundary--\r\n"; #----------------接続処理------------------- socket(SOCKET, PF_INET, SOCK_STREAM, 0); connect(SOCKET, pack_sockaddr_in(80, inet_aton($host))); select(SOCKET); $|=1; select(STDOUT); #------------HTTPリクエスト送信----------------- print SOCKET "POST /$path HTTP/1.0\r\n"; print SOCKET "Content-Type: multipart/form-data; boundary=$boundary\r\n"; #ここが増えてる print SOCKET "Content-Length: ".length($data)."\r\n"; print SOCKET "\r\n"; print SOCKET $data; #$dataがmultipart用データ #------------サーバからのデータを受信 ----------------- while (<SOCKET>){print $_;}

workpad30j
質問者

お礼

ありがとうございます。 度々、ご親切にサンプルまで書いてくださってありがとうございます。 サンプルは、$host,$path,$fileを設定するだけで、そのまま使用できました。 実は、質問を投稿した後でmultipartでの送信方法を調べて自分なりに試していたのですが、動作せず、悩んでました。 Content-Lengthは必須だということには気付きませんでした。 また、区切り文字も途中のものと最後のもので少し違うということも知らなかったです。 助かりました。 勉強になります。ありがとうございました。

関連するQ&A

  • Perlのファイルのアップロードの方法についてお聞きします。

    Perlのファイルのアップロードの方法についてお聞きします。 &ReadParseを用いた方法で、 $file = $in{'TENSOU'};で$file自体にデータが入るので 簡単だなと思っていましたが、送信元と送信後のファイルが若干違っていました。 使い方が間違っているのでしょうか? 以下、サンプル ◆HTML側 <FORM ACTION="up.cgi" ENCTYPE="multipart/form-data" METHOD="POST"><P> ファイル: <INPUT TYPE="file" NAME="TENSOU" SIZE="32"><BR> <INPUT TYPE="submit" VALUE="送信"> </FORM> ◆Perl側 &ReadParseの例を用いた方法 #!/perl/bin/perl #!/usr/local/bin/perl use CGI; use CGI::Carp qw(fatalsToBrowser); #--->エラー対策 require 'cgi-lib.pl'; require 'jcode.pl'; $BUFSIZE = 2048; &ReadParse; # ==> 強力な変換 $file = $in{'TENSOU'}; # ==> 実態自体がデータなので、取り扱いしやすい $file_size = length($file); $file_size *= ($BUFSIZE / 1024); open(OUT, "> test.jpg"); print(OUT $file); close(OUT); print "Content-type: text/html\n\n"; print "$file_size(KB)<br>\n"; print "<a href=\"test.jpg\">テスト</a>\n"; exit;

    • ベストアンサー
    • CGI
  • フォームの一部のfileを送信

    上手に出来る方法をアドバイス下さい。 <form method="post" name="uploadForm" id="uploadForm" enctype="multipart/form-data" action="aaa.php"> <input type="text" name="text1" id="text1"> <input type="file" name="upload_file" id="upload_file"> <input type="button" value="アップロード"> <input type="text" name="text2" id="text2"> <input type="submit" value="送信"> </form> のようなフォームで「アップロード」が押された場合、"upload_file"だけ送信したいのですが上手い方法があるでしょうか? また、「送信」が押された場合、"upload_file"以外を送信したいです。 「POST先で無視をする」以外でお願いします。

  • Perl の use strict に付いて

    ●HTML <html><head> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <title>テスト5(UTF-8)</title> </head> <body> <form action="test5.cgi" method="post" > <input type="text" name="f1" value="" size="80"> <button type="submit" >送信</button> </form> </body></html> —————————————————————————————————————— ●Perl #!/usr/bin/perl #use strict; ※問題の行1 use warnings; use CGI; print "Content-type: text/html\n\n"; print "<meta charset=\"UTF-8\">\n"; # POST / GET パラメータを取得------------------------- my $q = new CGI; # パラメータ名を指定して取得する my $param1 = $q->param('name1'); my $param2 = $q->param('name2'); # FORM値の取得----------------------------------- # 全てのパラメータを取得する for my $param_name ($q->param) { print $param_name . ' = ' . $q->param($param_name) ; print "<br>\n"; ${$param_name} = $q->param($param_name); ※問題の行2 } #------------------------------------------------- print "テスト<hr>\n"; print "$f1<br>\n"; exit; —————————————————————————————————————— 【質問】 「※問題の行1」+「※問題の行2」 = エラー 「※問題の行1」のみ = 正常に動きます 「※問題の行2」のみ = 正常に動きます 「※問題の行1」の「use strict; 」と 「※問題の行2」の「${$param_name} = $q->param($param_name); 」 をどう書き換えれば、二つとも記述したまま正常に動くのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • ファイルのアップロード方法(Perl)

    <INPUT TYPE="file">で指定されたファイルをサーバーにアップロードする方法をさがしています。 CGIの記述言語はPerl、転送を行うファイルは画像ファイルです。 送られてきたデータを確認したところユーザー側のファイルへのフルパスなのは確認できましたが、そこからアップロードする方法が分かりません。 パールライブラリ(.plか.pm)でファイル転送を行う良いライブラリがあれば教えてください。 また、転送の方法を教えてください。

    • ベストアンサー
    • Perl
  • Perlでファイルをアップロードしたい

    えーPerlを使用してローカルからサーバーへFTPを使わず、かつパスを指定してファイル(CSV)をアップロードさせたいのですが、フォームの<input type="file"...>ではファイルを参照ボタンで指定せなだめなため使いたくないのです。一瞬フォームから<input type="hidden">を使用してファイルの中身をデータにして送りサーバでファイルを作ろうかとも考えたのですがサーバ側に負担がかかりそうで・・・教えてください。お願いします。

  • Perlでファイルをアップロードさせたい

    えーPerlを使用してローカルからサーバーへFTPを使わず、かつパスを指定してファイル(CSV)をアップロードさせたいのですが、フォームの<input type="file"...>ではファイルを参照ボタンで指定せなだめなため使いたくないのです。一瞬フォームから<input type="hidden">を使用してファイルの中身をデータにして送りサーバでファイルを作ろうかとも考えたのですがサーバ側に負担がかかりそうで・・・教えてください。お願いします。

    • 締切済み
    • CGI
  • ファイル選択ダイアログでファイルの種類を指定する方法

    下記のプログラムでファイル選択のダイアログを表示しますが 【ファイルの種類】をデフォルトでCSVの指定はできますか? よろしくお願いします。 <html> <body> <form enctype="multipart/form-data" action = "test_02.php" method = "post" > <input type="file" name="file_data1"> <input type="submit" name="FILE送信" value="FILE送信"> </form> </body> </html>

    • ベストアンサー
    • HTML
  • IO-Socketで…

    最初に開かれた1つのソケットで、 サーバーから不定期に送られてくるデータを処理→表示しつつ、 ユーザーから入力があった場合にそのソケットへ送信するといったメッセンジャーを作ろうと思っているのですが、「入力待ちと受信待ちを同時に進める」という事がどうも上手くいってくれません… use threads;を使い、送信用・受信用と分けたのですが、やはりどちらか一方が止まってしまいます…。 どの様に書いたらよいのでしょうか… 何方かご教授下さい…。 use threads; use IO::Socket; ($test_socketを生成) sub send{ while($input = <STDIN>){ chomp($input); print $test_socket "$input"; } sub recv{ while(1){ if($receive = <$test_socket>){ print "$receive\n"; } } } my $sendthread = threads->new(\&send); $sendthread->join(); my $recvthread = threads->new(\&recv); $recvthread->join();

  • メールフォームのファイル送信の必須項目について

    PHPプログラム配布サイトPHP工房 さんのPHP多機能メールフォーム 全機能搭載版(有料版)を利用しています。 これでファイル送信を必須項目にしたいです。 <input type="file" name="upfile[]" /> <input type="file" name="upfile[]" /> <input type="file" name="upfile[]" /> <input type="file" name="upfile[]" /> 複数ありまして全部で4つ設置します。 --------------- 必須入力項目(入力フォームで指定したname属性の値を指定してください。 --------------- のところで'upfile'といれたのですが、これだ画像を添付しても「入力されていません」となり確認画面に移行しませんでした。 ファイル添付を必須項目にしたいのですがどうすればいいでしょうか。やり方お判りのかたいらっしゃいましたらご教授願います。 また、 確認画面でファイル1、ファイル2,ファイル3,ファイル4として添付した画像を表示させることが可能でしたら合わせて教えてほしいです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • perl 変数 代入

    恐れ入ります。 Perlで、フォームから送信して、変数に代入したいのですがうまくいきません。 print qq!<form action="./xxx.cgi" method="get">!; opendir(DIRHANDLE, "./xxx"); foreach(readdir(DIRHANDLE)){ next if /^\.{1,2}$/; print qq! <input type="checkbox" name="$_" value="$_"> <input type="submit" value="送信"></form> とし、ディレクトリ内のフォルダ名をnameに格納してxxx.cgiへ送信します。 xxx.cgi側では、 #!/usr/bin/perl use cgi; $form = CGI->new; として、送信されたデータを次々と代入したいのですが、どのようにしたらよいでしょうか。

    • ベストアンサー
    • Perl

専門家に質問してみよう