• 締切済み

画像ファイルの受信

ブラウザのフォームから送られたファイルデータを読み取り、保存するプログラムを作成しています。 socket() bind() listen() accept() を用いてブラウザから届いたマルチパートデータ(以下のような) ヘッダ ~ -----------------------------boundary Content-Disposition: form-data; name="~"; filename="~" Content-Type: text/plain ファイル内容 -----------------------------boundary をrecvして、そこからファイル内容を取り出すという方法を考えていたのですが、画像ファイルを受信するとrecvが途中で止まってしまいます。textファイルでの動作は確認しました。 他の方法でも結構ですので、ブラウザから画像ファイルを受信できる方法を伝授いただけるとありがたいです。

みんなの回答

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

送信が終わっているのに recv してブロックしてるのでしょうか recvの終了はどうやって判定してますか とりあえず受信は別スレッドにしたほうがいいでしょう

kjhgkkk
質問者

補足

解答ありがとうございます。 recvの終了の判定は、recvを一定数バイト(ここでは32バイトでやっています)ずつ行い、実際にrecvしたバイトが32に満たない場合に終了というようにしています。 ちなみに画像を受信した場合Content-Disposition、Content-Typeまでは正常で、ファイル内容の受信でとまってしまっているようです。

関連するQ&A

  • ファイルをアップロードするとファイルの中に・・・

    今、JAVAservletでファイルをアップロードするプログラムを作成しています。 であるサイトを参考に実装することには成功したのですが、予期せぬことに リクエスト内にある取り出す必要のない情報もいっしょにファイルに書き込まれて しまいます。FORMのボタンの情報が一番最後についてくるのです。 content-Type: multipart/form-data; boundary= ---------------------------10265533117308 -----------------------------10265533117308 content-disposition: form-data; name="submitter" username -----------------------------10265533117308 content-disposition: form-data; name="Uploaded file"; filename="abc" [... contents ...]  ← ココのみを取り出したい -----------------------------10265533117308 が、この場所にあるFORMボタンの名前などの情報も引っ付いてしまっている。 ------------------------------------------ どうやら、boundary 文字列 で区切られているという事は 調べたのですが、かといって「boundary」がなんなのかさっぱり わからず、切り離すにもどうしたらいいのかわからない状態なのです。  何か良い知恵を貸してください。 また、そういったことを詳しく乗せているサイトの情報などもお願いします。

    • ベストアンサー
    • Java
  • PHPからファイルアップロードの実現

    ブラウザからファイルをアップロードするように、PHP内で同じことを実現させたいと考えています。 fsockopenを使用してGETやPOSTをすることは実現できていますが、ファイルのアップロードとなると少々勝手が違い、うまいことできません。 現状では下記のようなものを送信させているのですが、受け取り側のPHPで認識できません。 POST /upload.php HTTP/1.0 host: 127.0.0.1 Content-Type: multipart/form-data; boundary=---test Connection: close Content-Length: 120 ---test Content-Disposition: form-data; name="test"; filename="test.txt" Content-Type: text/plain testtest ---test 現状、テスト用に upload.php というので受け取っているのですが、$_FILES 変数は空の状態です。 基本的なところを理解していないので、根本的に間違っていたり、足りないところがあるような気がするのですが…。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • サーバーでのデコード方法(例えばbase64)

    質問内容 サーバーでのPHPスクリプトではアップロードされたファイルのデコードを行うにはContent-Transfer-Encoding: base64をみて 適切にデコード処理をするのだと考えますがContent-Transfer-Encoding: base64を取得する方法はどのようにすればいいか わからなくて困っています。 $_FILES,getallheaders(),file_get_contents('php://input')等を試しましたが必要な情報は得られませんでした。 知りたい内容は 1.ポストされたアップロードファイルのデコードはどのような判定方法になるか。 2.私は先にも記述しましたがContent-Transfer-Encoding: base64行を判定の基準とするものとと考えています、でもその内容の取得方法がわかりません。 3.および、これらの関連として生のデータ取得についても教えていただければ幸いです。($_POSTや$_FILESに加工される前の情報) 環境: SERVER_SOFTWARE : Apache/2.2.11 (Win32) mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.8 下記はHTTPプロトコルでサーバーに送られたデータストリームです。 (info1とinfo2は質問内容には直接関係はありません) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ POST /test/xxxx.php HTTP/1.0 Host: 192.168.xxx.uuu User-Agent: wxWidgets 2.x Content-Length: nnn Content-type: multipart/form-data; boundary=_--Boundary_separator --_--Boundary_separator Content-Disposition: form-data; name="info1" AAAAAAAAAAAAAAA --_--Boundary_separator Content-Disposition: form-data; name="info2" BBBBBBBBBBBBBBB --_--Boundary_separator Content-Disposition: form-data; name="file"; filename="anyfile.jpg" Content-Type: multipart/form-data Content-Transfer-Encoding: base64 base64でencodeされたデータ内容の羅列 --_--Boundary_separator-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 以上 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPでサーバーへアップロードについて

    FORMを使わずにPHP(ソケット通信)でPOSTを利用して、クライアントPCの ファイルをサーバーにアップロードしたいのですが、うまくいきません。 ..レスポンスは、「HTTP/1.1 200 OK」で戻って来るのですが、 $_FILESの中が空の状態です。 一応、POSTでメッセージボディのデータも送れるレベルにはなったのですが ファイル転送ではうまくいきません。 他の(過去)投稿などの情報もいろいろ調べたり、書籍なども参考にしましたが いまひとつ良くわかりません。 (サーバーの設定によっても変わるのでしょうか) 根本的な間違いなどもあるかも知れませんが、以下のような送信文で 試しています。 ご存知の方がいらっしゃいましたら是非ご教授お願いします。 ---(↓以下送信文 sock_send.php)------------------------ POST /test/sock_recv.php HTTP/1.0 host: www.hogehoge.com Content-Type: multipart/form-data; boundary=transfer //Accept-Encoding: gzip //Accept-Language: ja //Accept-Charset: Shift_JIS,EUC-JP,UTF-8 Accept: text/*, */* Content-Length: 126 Connection: close --transfer Content-Disposition: form-data; name="sendfile"; filename="C:\temp\...\test.txt" Content-Type: text/plain --transfer ---(↑以上送信文)------------------------ 注)//はコメント部、空白行は改行しています。 コメントも含めてヘッダーは幾つかの組み合わせで試しています。 尚、環境はレンタルサーバーで以下の内容です。 Server: Apache/2.0.46 (Red Hat) X-Powered-By: PHP/4.4.2  テストファイルの容量は100バイト以下の小さいものです。

    • 締切済み
    • PHP
  • 画像の添付ファイルをメールで送信する

    頑張って、作ったけど、うまくいかないよぉ・・・ だれか、たすけてくださぃにゃん。 //メールのヘッダ $header = "Cc:$cc\n"; $header .= "From:$from\n"; $header .= "X-Mailer: PHP/".phpversion()."\n"; $header .= "MIME-version: 1.0\n"; if(file_exists($upfile)){ //アップファイルがあれば $header .= "Content-Type: multipart/mixed;\n"; $header .= "\tboundary=\"$boundary\"\n"; $msg .= "This is a multi-part message in MIME format.\n\n"; $msg .= "--$boundary\n"; $msg .= "Content-Type: text/plain; charset=ISO-2022-JP\n"; $msg .= "Content-Transfer-Encoding: 7bit\n\n"; }else{ $header .= "Content-Type: text/plain; charset=ISO-2022-JP\n"; $header .= "Content-Transfer-Encoding: 7bit\n"; } $msg .= "本文だよ\n"; //ファイルの読み込み if(file_exists($photo1)){ $fp = fopen($photo1, "r") or die("error"); $contents = fread($fp, filesize($photo1)); fclose($fp); $f_encoded = chunk_split(base64_encode($contents)); //エンコードして分割 $msg .= "\n--$boundary\n"; $msg .= "Content-Type: " . $photo1_type . ";\n"; $msg .= "\tname=\"$photo1_name\"\n"; $msg .= "Content-Transfer-Encoding: base64\n"; $msg .= "Content-Disposition: attachment;\n"; $msg .= "\tfilename=\"$photo1_name\"\n\n"; $msg .= "$f_encoded\n"; } $msg .= "--$boundary--"; //メール送信を実行する mb_send_mail( $to, $subject, $msg, $header );

    • 締切済み
    • PHP
  • ファイルの受信

    c言語で、クライアント側のファイルを開き、内容をそのまま送信しているはずなのですが上手くいきません。 テキストファイルは正しく送れるようですが、他の実行ファイルなどはダメみたいです。 送信側は、"rb"でオープンし,whileで fread(send_buf,1024,1,fp); send(soc,send_buf,strlen(send_buf),0); を繰り返しています。send_buf[1025]です。 送信側は Recv_buf[1025];で size = recv(soc,Recv_buf,1024,0); fwrite(Recv_buf,size,1,fp); whileで繰り返し受信がなくなったらselectでタイムアウトしています。 いろいろ調べたのですがSleepが必要らしいそうですが・・・どうなんでしょう?

  • PHP Windows版のmail()を使用して添付ファイルを送りたい

    はじめて、質問させていただきます。 環境はWindowsXP(Pro)+IIS+PHPです。 PHPのmail()関数を使用して、添付ファイルをメールで送信したいと考えております。 mail("-----@co.jp",$subject,$msg,$headers);を実行します。 $headersは、追加ヘッダということになっています。 $boundary="-*-*-*-*-*-*-*-*-*-Boundary_".uniqid("b"); とセットし、 $headersには、 $headers=Content-Type:multipart/mixed; $headers.=boundary=$boundary; として、実行します。 送られてきたメールのヘッダの内容を確認すると 「Content-Type」が、 Content-Type:text/plain; となってしまいます。 mail()関数のヘッダの指定方法は、これでいいのでしょうか? 実際のコードは、メッセージ部分などいろいろ書き込んでいます。いろいろ書き換えて実験してみましたが、どうも、この問題をクリアできないと添付ファイルメールを送信することができないようです。 ご存知の方があれば、教えていただきたいです。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • cakephpでPOST(ajax)データを取得

    Cakephpからajaxでポストされたファイルデータをデータベースに保管したいのですが ポストの中身が取得できなくて困っています。自分なりに調査したのですが 結局パケットをキャプチャしてみても解決しないままです。 以下の二つにさほど違いはないように思えるのですが何が原因でしょうか? 必要な情報があれば補足いたします。 Cakephpの$this->request->dataからポストデータが正常に取得できるリクエスト POST /images/add HTTP/1.1 Host: yahoo.yahoo.yahoo User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ja,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate Referer: http://yahoo.yahoo.yahoo/Administrators/makeTitleData Cookie: CAKEPHP=5d7cd855ad316267673b8a20e5fbcf9c Connection: keep-alive Content-Type: multipart/form-data; boundary=---------------------------199552540520686 Content-Length: 964 -----------------------------199552540520686 Content-Disposition: form-data; name="_method" POST -----------------------------199552540520686 Content-Disposition: form-data; name="data[Image][name]"; filename="" Content-Type: application/octet-stream -----------------------------199552540520686 Content-Disposition: form-data; name="image" -----------------------------199552540520686 Content-Disposition: form-data; name="data[Image][contents]" -----------------------------199552540520686 Content-Disposition: form-data; name="data[Image][moto_filename]" -----------------------------199552540520686 Content-Disposition: form-data; name="data[Image][filetype]" -----------------------------199552540520686 Content-Disposition: form-data; name="data[Image][filesize]" -----------------------------199552540520686 Content-Disposition: form-data; name="btnSave" ...... -----------------------------199552540520686-- Cakephpの$this ->request->dataでポストデータが取得できないリクエスト prの出力は空配列→array()(ajax+FormDataオブジェクトにて生成されたリクエスト) POST /Images/add HTTP/1.1 Host: yahoo.yahoo.yahoo User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0 Accept: */* Accept-Language: ja,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate Content-Type: false X-Requested-With: XMLHttpRequest Referer: http://yahoo.yahoo.yahoo/Administrators/makeTitleData Content-Length: 572 Cookie: CAKEPHP=5d7cd855ad316267673b8a20e5fbcf9c Connection: keep-alive Pragma: no-cache Cache-Control: no-cache -----------------------------243202103330754 Content-Disposition: form-data; name="filename" a.txt -----------------------------243202103330754 Content-Disposition: form-data; name="contents" aaa -----------------------------243202103330754 Content-Disposition: form-data; name="moto_filename" b.txt -----------------------------243202103330754 Content-Disposition: form-data; name="filetype" image/jpg -----------------------------243202103330754 Content-Disposition: form-data; name="filesize" 10 -----------------------------243202103330754-- 何がいけないのでしょうか・・。 よろしくお願いいたします。ご回答お待ちしております。

    • 締切済み
    • PHP
  • 画像をダウンロードさせたい。

    いろいろなファイルがサーバーにあがっているとして、 その一覧が<a href="">ファイル名</a>で表示されているとします。 ファイル名を押下した時にダウンロードさせたいと思っています。 -------------------------------------------------- header("Content-Disposition: inline; filename=".$fileDlName); header("Content-Length: ".$fileDlSize); header("Content-Type: application/octet-stream"); readfile($filePath) ------------------------------------------------- ↑でCSV,PDF,ZIPファイルなどはダウンロードできるようになりました。 が、JPEG,GIF,PNGなどはブラウザに表示されてしまい ダウンロードできません。 画像も強制でダウンロードさせたいのですがよい方法はありますか?? ブラウザ:IE7 PHP:5.2.3 Apache:2.0.59 以上、よろしくお願いいたしますm(_ _)m

    • ベストアンサー
    • PHP
  • Solarisサーバからの添付ファイル付メールをWebメールで受信すると添付ファイルを認識しない

    Solarisサーバ(SunOS 5.10)からテキストファイルを添付し、インターネットメールを 送りたいと考えています。 下記内容のシェルスクリプトを作成し、実行しているのですが、 Outlook等メーラーで受信すると正しくファイルが添付されますが、 Yahoo!メール等のWebメールではファイルが添付されず、エンコードされた ファイル内容が本文に直接記載されてしまいます。 uuencode $DATA_FILE $FILE_NAME > $TMP /usr/SUNWale/bin/mailx -s "$SUBJECT" $USER < $TMP 受信メールのヘッダ情報を確認するとWebメールの場合は、 Content-Type: text となってしまうのに対し、メーラーから添付ファイルを送信すると Content-Type: application/octet-stream; name="=(省略) Content-Disposition: attachment; filename="=?ISO-2022-JP?(省略) Content-Transfer-Encoding: base64 となります。 このあたりが関係しているとは思うのですが、解決策が見つかりません。 メーラーでもWebメールでも添付ファイルを受信できる方法をご存知の方が いらっしゃればご教授下さい。 よろしくお願いいたします。

専門家に質問してみよう