ホームページ >バックエンド開発 >PHPチュートリアル >PHPサーバー側でmultipart/form-data postのjsonデータを取得する方法
クライアントは 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'));
クライアントは Java であり、それをコピーしてテストを行うことができます。 ? ?
ファイルをアップロードしながら複数のデータをアップロードするのは通常のアプリケーションではないでしょうか?
この multipart/form-data は関連しています。
$_POST を使用して json データを取得することはできません。
これはクライアントの問題ではありません、上司!同じ Java コードは、他の PHP 以外のサーバーでも正常に動作します。
この質問は、php の経験がある学生にとっては非常に簡単なはずです。助けてください。
アップロードしたファイルは正常に取得できるようになりましたが、jsonデータの取得方法がわかりません。
test.txt の内容を確認するために
file_put_contents('test.txt', file_get_contents('php://input'));
してもらいましたか?
ボス、私はそれをしましたが、何も返信しませんでしたか?
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 は単なる文字列であると考えないでください。送信する限り、データ ストリーム内に存在する必要があります
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--
所以最好是与客户端的开发人员协商,给每个数据项都起个名字。
这个每个数据项都起个名字是啥意思?我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去获取的,