電子書籍の厳選無料作品が豊富!

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">

よろしくお願いします。

A 回答 (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 $_;}
    • good
    • 0
この回答へのお礼

ありがとうございます。
度々、ご親切にサンプルまで書いてくださってありがとうございます。
サンプルは、$host,$path,$fileを設定するだけで、そのまま使用できました。

実は、質問を投稿した後でmultipartでの送信方法を調べて自分なりに試していたのですが、動作せず、悩んでました。

Content-Lengthは必須だということには気付きませんでした。
また、区切り文字も途中のものと最後のもので少し違うということも知らなかったです。

助かりました。
勉強になります。ありがとうございました。

お礼日時:2007/09/19 09:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!