• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Perlでuse socketを使用してファイルを送信)

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

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

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

  • ベストアンサー
回答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は必須だということには気付きませんでした。 また、区切り文字も途中のものと最後のもので少し違うということも知らなかったです。 助かりました。 勉強になります。ありがとうございました。