ホームページ >バックエンド開発 >PHPチュートリアル >PHPサーバー側でmultipart/form-data postのjsonデータを取得する方法

PHPサーバー側でmultipart/form-data postのjsonデータを取得する方法

WBOY
WBOYオリジナル
2016-06-23 13:52:132576ブラウズ

クライアントは Java を使用して、json パラメータ配列とアップロードされたファイルを含む multipart/form-data リクエストをポストします。
PHPサーバー上のJSONデータを解析/取得するにはどうすればよいですか?


ディスカッションへの返信(解決策)

以下は Java クライアント コードです
public void doPost() {
Log.d(TAG, "======doHttpConnectionPost "); null; DataOutputStream を実行します。 = null;
InputStream in = null;
StringBuilder paramStr = new StringBuilder("");
while(i.hasNext()); I.NEXT ();
Log.d (tag, "key:"+key+", value:"+mparam.getString (key)); (! (Key_logfile.equals (key))) {
if( paramstr.length()&gtr.append( "=");キー)、「UTF-8」); ) url.openConnection();
conn.setReadTime out(HTTP_PARAM_TIMEOUT) ;
conn.setDoOutput(true);            conn.setRequestProperty("文字セット", CHARSET);
conn.setRequestProperty("接続", "キープアライブ");
conn.setRequestProperty("Content-Type", multipart/form-data + ";boundary=" + BOUNDARY);

dos = new DataOutputStream(conn.getOutputStream());
Log.d(TAG, "====after open conn.getoutputstream");

i = mParam.keys();
マップ files = new HashMapf5eb491298a133d59f3f5faa643806af();
while(i.hasNext()) {
文字列キー = i.next();
if ((KEY_LOGFILE.equals(key))) {
Log.d(TAG, "key :" + key + ", value : " + mParam.getString(key) );
if (!TextUtils.isEmpty(mParam.getString(key))) {
files.put(key, new File(mParam.getString(key))); (}}
}}}

for(map.entry< string、file> file:files.entryset()){
if(file.getValue()!= null && file.getValue()。exists(){exists(){
StringBuilder sb = new StringBuilder();
sb.append(PREFIX);
sb.append(BOUNDARY);
sb.append(LINEND);

sb.append("Content-Disposition: form-data; name="" + file.getKey()
+ ""; filename=""+file.getValue().getName()+""+リネンド);
sb.append("Content-Type: application/octet-stream; charset="+CHARSET+LINEND);
sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
sb.append(LINEND);
Log.d(TAG, sb.toString());

dos.write(sb.toString().getBytes());
                    InputStream は = 新しい FileInputStream(file.getValue());
Log.d(TAG, "filevalue="+file.getValue());
byte[] bytes = 新しい byte[1024];
int len = 0;
while((len = is.read(bytes)) != -1) {
dos.write(bytes, 0, len);
Log.d(TAG, 「in read file」+len);
}
is.close();
dos.write(LINEND.getBytes());

}
byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
dos.write(end_data);
dos.flush();

int res = conn.getResponseCode();
Log.d(TAG, "res = " + res);
if(res==200){
in = conn.getInputStream();
int ch;
StringBuilder sb2 = new StringBuilder();
while ((ch = in.read()) != -1)
{
sb2.append((char) ch);
}
Log.d(TAG, "応答エンティティ文字列:" + sb2);
mResponse = new JSONObject(sb2.toString());
}else{
Log.d(TAG, conn.getResponseCode()+conn.getResponseMessage());
in = conn.getErrorStream();
}
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
} 最後に {
試してみてください。 null) {
dos.close(); 接続を解除します ();}} Catch (IOEXCEPTION E) {
e.printstacktrace ();
.txt の内容を確認してください
json データ_POST を使用して取得することはできませんか?

すべての結論は調査と研究の結果です。

file_put_contents('test.txt', print_r($_POST, 1));
test.txt ファイルへの出力は空です。

これを理解するのを手伝ってくれる専門家はいますか?

いいえ?ただ
file_put_contents('test.txt', file_get_contents('php://input'));

test.txt の内容を見てみましょう


クライアントは Java であり、それをコピーしてテストを行うことができます。 ? ?

投稿モードだと言いましたが、$_POST には値がありません。それは明らかにクライアントに問題があります。

ファイルをアップロードしながら複数のデータをアップロードするのは通常のアプリケーションではないでしょうか?

この multipart/form-data は関連しています。

$_POST を使用して json データを取得することはできません。
これはクライアントの問題ではありません、上司!同じ Java コードは、他の PHP 以外のサーバーでも正常に動作します。

この方法でアップロードしたことがありますか?

この質問は、php の経験がある学生にとっては非常に簡単なはずです。助けてください。

アップロードしたファイルは正常に取得できるようになりましたが、jsonデータの取得方法がわかりません。

test.txt の内容を確認するために
file_put_contents('test.txt', file_get_contents('php://input'));
してもらいましたか?

ボス、私はそれをしましたが、何も返信しませんでしたか?

'php://input' は multipart/form-data post のデータを取得できませんね?


file_put_contents('test.txt', print_r($_POST, 1)); にはコンテンツがないと答えただけであり、file_put_contents('test.txt', file_get_contents('php://input')) とは言っていません。 ; コンテンツはありません

php://input が取得するものは、php によって解析されていないもの (または php 解析後の残りの入力ストリーム) です

php://input にコンテンツがない場合は、php によって解析されている必要があります
$_FILES に値があるかどうかを確認できます。データがアップロードされたファイルとして処理されている可能性が非常に高いです。ネットワーク送信の場合、json は単なる文字列であると考えないでください。送信する限り、データ ストリーム内に存在する必要があります

multipart/form-data は application/x-www-form-urlencoded の特殊なケースです

application/x-www- の拡張とみなすこともできますform-urlencoded
必要なもの http プロトコルを使用してファイルをアップロードするには、multipart/form-data ステートメントが必要で、合意された方法でデータを整理する必要があります

ファイルをアップロードしたかどうかについては、私が参加した関連プロジェクトを見つけることができますここ数年のハイライトエリアでのファイルのアップロード方法についての議論

完全に仕様通りに書いているだけで、確かに失敗経験はありません

file_put_contents('test.txt', file_get_contents('php) ://input'));

ファイルにコンテンツがありません。

file_put_contents('test.txt', print_r($_FILES, 1));
总该有内容了吧?

file_put_contents('test.txt', print_r($_FILES, 1));
打印出来是这个:

Array
(
    [logFile] => Array
        (
            [name] => log.zip
            [type] => application/octet-stream
            [tmp_name] => /var/www/php7Ax336
            [error] => 0
            [size] => 28571
        )

)

嗯,这还是附加的数据没有命名的原因
php在解析post方式 数据时,会忽略 name="" 这一节的数据

为此用 curl 做了一下测试

$file = realpath('0.txt');$fields = array( 'f' => '@'.$file, '' => 'abcd', //没有名字就收不到,反之就可以收到);$ch = curl_init();  curl_setopt($ch, CURLOPT_URL,"http://localhost/ajax_server.php?id=1");  curl_setopt($ch, CURLOPT_POST, 1 );curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);curl_exec ($ch);  curl_close ($ch);  
但是数据是完整的传到了
--------------------------6e77d33195b440f3Content-Disposition: form-data; name="f"; filename="D:\\AMP\\web\\0.txt"Content-Type: application/octet-stream这是一个测试--------------------------6e77d33195b440f3Content-Disposition: form-data; name=""abcd--------------------------6e77d33195b440f3--

所以最好是与客户端的开发人员协商,给每个数据项都起个名字
当然你也可以用 php 来解决这个问题,那就是在 php.ini 中加上
enable_post_data_reading = Off
这就阻止了 php 解析 post 方式数据的动作
输入流就可以被 php://input 取到了
然后你再对读到的数据分类保存,你肯定比 php 勤快,不可能忽略掉没有名字的数据项了

注意:由于你阻止了 php 对 post 数据的解析额,所以 $_POST、$_FILES 都无效了!应用时切切注意

所以最好是与客户端的开发人员协商,给每个数据项都起个名字。
这个每个数据项都起个名字是啥意思?我post的数据:
http://api.hdtv.com/save?modelName=%E8%AE%BE%E7%BD%AE&type=S60&contact=777720&description=&version=V320R470C096B07166T&versionName=3.0.096T&model=S60&ui=3.0&hwVersion=H5001&mac=be60ebe15a7c

解决办法只能是修改php.ini吗?

我#17下部第7行 
Content-Disposition: form-data; name= ""
name 为空串,就是没有名字

找个人不也要喊名字吗?光喂喂喂的谁踩你?


你给的那个连接是什么意思?什么东西都不显示

大侠 您好,

我的name是有名字的啊?name=log.zip

那个链接是post数据的url,都有名字。

这个问题怎么解决,请问大侠?

你不是说:包含json参数数组,和一个上传的文件 吗?
打印 $_FILES 有
[logFile] => Array
        (
            [name] => log.zip
这个是有名字的,表示文件上传正确
打印 $_POST 是空的(#5)
表示那个 json 数据没有被接收到

你那个连接,一是没有任何显示,不知是否正确。而是看源码(不是很仔细),也没看到有上传或提交

再说那是 js 操作的页面,与 Java 有什么关系?

我的代码是手机上android的java上传,
你说js是什么意思?
有什么办法吗?大侠

这段java代码和其他服务器配合是没有问题的,
我现在是想在服务器端用php接收而已。
求大侠,高手帮助啊

这个问题找到原因了
http://api.hdtv.com/save?modelName=%E8%AE%BE%E7%BD%AE&type=S60&contact=777720&description=&version=V320R470C096B07166T&versionName=3.0.096T&model=S60&ui=3.0&hwVersion=H5001&mac=be60ebe15a7c
这个url里的参数是得用_GET去获取的,

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:PHPアルゴリズム次の記事:PHPアルゴリズム