PHPからファイルアップロードの実現

このQ&Aのポイント
  • PHPを使用してブラウザからファイルをアップロードする方法について説明します。
  • fsockopenを使用してGETやPOSTをすることはできますが、ファイルのアップロードは異なる方法が必要です。
  • $_FILES変数が空のまま受け取ってしまう場合、初歩的な部分での誤りや不足が考えられます。
回答を見る
  • ベストアンサー

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 変数は空の状態です。 基本的なところを理解していないので、根本的に間違っていたり、足りないところがあるような気がするのですが…。 よろしくお願いします。

  • ttyp03
  • お礼率88% (183/206)
  • PHP
  • 回答数2
  • ありがとう数3

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

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

区切り文字の解釈が間違っています boundary=hogehoge の場合に区切り文字は --hogehoge になります。 boundary=-test にするか -----test で区切りましょう

ttyp03
質問者

お礼

できました! 単純なことだったんですね。 どこぞのサイトでサンプルを見たら、質問に書いたようになっていたので、それが間違っていたようです。 回答ありがとうございました。助かります。

その他の回答 (1)

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

連続ですいません。 最後の区切り文字の後に--をつけましょう(無くても動作はすると思いますが)

参考URL:
http://rfc.net/rfc1867.html#s6.
ttyp03
質問者

お礼

再びありがとうございます。 参考URL、参考にさせていただきます。

関連する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にてファイルをアップロード2

    先日質問させていただいたものなんですが、本やサイトを参考にして、以前とは違ったphpを使用してファイルをアップロードしようと考えています。 <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=Shift_JIS"> <title><?php echo basename($PHP_SELF);?></title> </head> <body> <p>ファイルアップロード</p> <form method="POST" action="gazou_upload.php" enctype="multipart/form-data"> <input type="file" name="uploadfile"> <input type="submit" value="送信"> </form> <?php if(isset($uploadfile)) { // アップロードされたファイルのサイズを確認 if($uploadfile_size <= 2097152) { // 移動 $moveto = "/public_html/img" . basename($uploadfile_name); move_uploaded_file($uploadfile, $moveto) or die("アップロード失敗\n"); print "<p>ファイルをアップロードしました。 - $moveto</p>"; } } ?> </body> </html> 上記を使おうと思っているのですが、これを使用した場合、 (1)上記をhtmlとしておくだけで、ファイルのアップが可能になるのか?phpも必要ですよね? (2)この場合アップされたファイルはドコに保存されるのか?…僕はpublic_htmlの中のimgというフォルダに移動して欲しいのですが。 皆様お手数ですが、教えていただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • ファイルのアップロード

    いつもお世話になっております。 ファイルをアップロードするプログラムを作成しています。 最大ファイルサイズを200MBに設定しようと思っております。 PHPの設定を行なったのですが、ブラウザがフリーズしていまい うまくアップロードできません。 設定は下記のようにしました。 間違い、アドバイスがありましたら、ご教示お願いいたします。 よろしくお願いいたします。 test.php -------------------------------------------------- <form name="form1" method="post" action="test.php" enctype="multipart/form-data">  <input type="hidden" name="MAX_FILE_SIZE" value="200000000" />  <input name="mfile" type="file">  <input name="cfm" type="submit" value="確認画面へ"> </form> php.ini -------------------------------------------------- max_execution_time = 180 memory_limit = 250M post_max_size = 225M upload_max_filesize = 225M <環境> PHP:5.2.5

    • 締切済み
    • 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
  • phpでのファイルアップロード

    ファイルのアップロードについてご質問があります。 宜しくお願いします。 基礎phpという本でファイルをアップロードするサンプルがあり、このスクリプトでアップロードされたファイルを格納する『upload』というディレクトリをサーバに作成し、スクリプトを実行して、実際にファイルがアップロードできているかffftpにて『upload』ディレクトリの中を見てみると、なにも表示されませんでした。しかしブラウザから http://myドメイン/upload/ファイル名 にアクセスすると表示されます。 ですのでアップロードはできているがファイルが見えないという状態になっております。また『upload』ディレクトリの削除などもできなくなってしまいます。 サーバの設定が関係しているのかとも思ったのですが、サーバの設定を変更することはできないので、プログラムがわで何とかできないでしょうか? 大変申し訳ありませんが宜しくお願いいたします。 以下がそのコードです。 【up.html】 <html> <head><title>File Uploader</title></head> <body> <form method="post" enctype="multipart/form-data" action="up.php"> <input type="file" name="upfile"> <input type="submit" value="upload"> </form> </body> </html> 【up.php】 <html> <head><title>File Uploader</title></head> <body> <p> file uploader </p> <?php $updir = "./upload/"; $filename = $_FILES['upfile']['name']; if (move_uploaded_file($_FILES['upfile']['tmp_name'], $updir.$filename) == FALSE){ print("Upload failed..."); print($_FILES['upfile']['error']); }else { print("<b>" . $filename . "</b> uploaded!"); } ?> </body> </html>

    • ベストアンサー
    • 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用ファイルアップロード機能について

    ドコモ端末でPHPのファイルアップロード機能を使えるようにしたいのですが、どのようにすればいいでしょうか? ちなみに、vodafoneならこの機能が使えます。 ドコモ端末で下のソースにアクセスすると、 ファイルを参照するボタンが見えず、ファイルをアップロードできません。 HTMLはキャリア毎に使えるタグがあるのは知っていますが、下のソースの場合はどのように変更すれば良いのでしょうか?ご教授下さい。宜しくお願いします。 #ソースはコレです。 <form method="post" action="upload_save.php" enctype="multipart/form-data"> <input type="hidden" name="max_file_size" value="1000000" /> <input type="file" name="upload_file" size="70"><br /> (上書き禁止) <input type="checkbox" name="forbidden" value="1" checked /> <input type="submit" value="アップロード" /> </form> #ファイル自体はphpですが、中身はほぼHTMLに関する質問になってしまい、申し訳ありません。

    • ベストアンサー
    • PHP
  • ファイルのアップロード (PHP, $_FILES)

    以下の内容で困っております、ご教授いただけますと幸いです。 ファイルのアップロードで、以下のようなPHPページを作成し 実際ファイルのアップロードを実行した場合、 IEやMozillaではうまくいくのですが、Operaでうまくいきません。。 $_FILES配列に何も入っていない状態です。 なにかブラウザ側の設定が原因なのでしょうか? ちなみにテストしているファイルのサイズは10KB以下でphp.iniでの "upload_max_size"の設定値は2MBです。 --簡易ソースコード-- <HTML> <BODY> <FORM ENCTYPE="MULTIPART/FORM-DATA" NAME="up" ACTION="./" METHOD="POST"> <INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="10000000"> <INPUT TYPE="FILE" NAME="userfiles" SIZE="50"> <INPUT TYPE="SUBMIT" VALUE="GO!"> <?PHP print_r ($_FILES); ?> </FORM> </HTML>

    • ベストアンサー
    • PHP
  • ファイルのアップロードの方法をお教えください

    初心者で困っております。何卒よろしくお願いいたします。 次のHTMLで画像をアップし、受け側のPHPで保存しようとしていますが、どうしてもエラーになってしまいます。 何もわかりませんもので、解決の方法を教えていただければ幸いです。 ファイルの送り側のHTMLファイル <html> <form action="upload_save_test1.php" method="POST" enctype="multipart/form-data"> <input type="file" name="uploadfile" size="60"> <input type="submit" name ="reg" value="登録"> </form> </html> 受け側のupload_save_test1.php <?php if(!move_uploaded_file($uploadfile,"tem.jpg")){ print "保存に失敗しました"; } ?> 何か根本的な問題なのでしょうか?

    • ベストアンサー
    • PHP
  • PHPで画像データーのアップロードを行っています。

    PHPで画像データーのアップロードを行っています。 一つの画像を imagesファイルにアップロードするまでは出来たのですが一度に複数の画像をアップロードする方法が分りません。 本で読んだところ、fileを配列にすれば良いと書いてあったのですが単純にフォームを配列にしてもやはり一つの画像しかアップ出来ませんでした。 -- form.html -- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <form enctype="multipart/form-data" action='upload.php' method='post'> <input type="hidden" name="MAX_FILE_SIZE" value="102400" /> <input type="file" width=40 name="sendfile" /> <input type="submit" value="送信" /> </form> </body> </html> -- upload.php -- <?php if (!isset($_FILES['sendfile']['name'])){ echo 'ファイルが見つかりません。'; exit; } $fname = $_FILES['sendfile']['name']; $temp = $_FILES['sendfile']['tmp_name']; $target = './images/' . $fname; if (move_uploaded_file($temp,$target)){ echo $fname . "をアップロードしました。"; } else { echo "アップロードに失敗しました。"; } ?> 勉強中の私に分り易く教えていただける方、よろしくお願いいたします。 また、PHPでのメール自動送信は出来たのですが自動受信が分りません。 (お問い合わせメールの様な) これはかなり難しいのでしょうか? フォームからウィンドウズメール、アウトルック等で受信できるようにしたいのですが? PHP3.5+XAMPPでエクリプスを使い勉強しています。

    • ベストアンサー
    • PHP