![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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">
よろしくお願いします。
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 $_;}
ありがとうございます。
度々、ご親切にサンプルまで書いてくださってありがとうございます。
サンプルは、$host,$path,$fileを設定するだけで、そのまま使用できました。
実は、質問を投稿した後でmultipartでの送信方法を調べて自分なりに試していたのですが、動作せず、悩んでました。
Content-Lengthは必須だということには気付きませんでした。
また、区切り文字も途中のものと最後のもので少し違うということも知らなかったです。
助かりました。
勉強になります。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP $filePath = './user_img/' . $file['name'];? 1 2022/12/10 07:29
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- PHP どうして送信されないのでしょうか? 1 2022/12/09 05:23
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- HTML・CSS 私の能力からして間違っていないような気がします。 4 2022/09/30 13:24
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
tracert ができない原因
-
wordの数式について 定積分を書...
-
ラジオボタンが両方とも選択で...
-
「value」に2つの値をセットす...
-
このメールフォームが機能しな...
-
[HTML]プルダウンメニューの横...
-
FORMのselectの選択肢を最初か...
-
チェックボックスの返す値
-
WEBページを強制的に横画面で見...
-
拡張子'html'と'htm'はどっちが...
-
VB初心者。小数点以下の表示で...
-
INPUT TYPE
-
チェックボックスとセレクトボ...
-
ボタンの処理
-
VB.net データーグリッドビュー...
-
ブックマークからのアクセスを...
-
select値をhiddenのvalueに渡し...
-
チェックボックスで選択した内...
-
Javascriptの変数をCGIに送る方法
-
(Perl)ReadParseによるハッシ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tracert ができない原因
-
【ASP.NET MVC】フォームヘルパ...
-
チェックボックスでのor検索
-
掲示板スパム対策(改造)ガー...
-
perlで書いたcgiでsqliteの使い...
-
入力フォームに全角・半角スペ...
-
sendmailのメール送信ができま...
-
splitについて教えてください。
-
日本語文字化け(GETメソッド?)
-
@town = ("Aタウン","Bタウン",...
-
JNAVIから提供されたメー...
-
アンケートの回答をcsv形式で保...
-
文字って数字で表現・・・
-
禁止ワードの設定
-
Perlでuse socketを使用してフ...
-
名前の改行の仕方
-
【CGI】画像の表示の仕方【Mini...
-
python初心者です。
-
c言語 構造体
-
perl ヒア文(print <<"EOM" ...
おすすめ情報