目次
ディスカッションへの返信(解決策)
ホームページ バックエンド開発 PHPチュートリアル PHPサーバー側でmultipart/form-data postのjsonデータを取得する方法

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

Jun 23, 2016 pm 01:52 PM
json multipart php post データ

クライアントは 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 HashMap();
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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

See all articles