ホームページ ウェブフロントエンド htmlチュートリアル MultipartEntity_html/css_WEB-ITnose を使用して HTTPclient でファイルをアップロードする方法

MultipartEntity_html/css_WEB-ITnose を使用して HTTPclient でファイルをアップロードする方法

Jun 24, 2016 pm 12:01 PM
httpclient アップロード 書類

jsp HTTPclient MultipartEntity multipart/form-data

jsp ページのアップロード ファイル コード:
<form enctype="multipart/form-data" method="POST" dir="ltr" lang="zh-cn" action=" /proxy/api/images/attachments/json/0/67/0/0/-1?Type=Image&CKEditor=textEditor&CKEditorFuncNum=1&langCode=zh-cn">
<label id="cke_161_label " for="cke_162_fileInput_input" style="display:none">サーバーにアップロード</label>
<input style="width:100%" id="cke_162_fileInput_input" aria-labelledby="cke_161_label" type=" ファイル" name="upload" size="38"></form>

httpclient 書き方がわかりません
インターネットでたくさん調べましたが、どれも私をコピーし、私もあなたのコピーをしました
これはすべてインターネット上でこのように書かれています。JSPコードは次のとおりです
&lt; form action = "http://localhost/index.html" method = "post"
name = "param1" balue = "china"/ >
<input type="text" name="param2" value="value2"/>
<input type="file" name="param3" /> "param1", new StringBody("中国" , Charset.forName("UTF-8")));
entity.addPart("param2", new StringBody("value2", Charset.forName("UTF-8") ));
entity.addPart("param3") ", new FileBody( new File("C:\1.txt")));

HttpPost request = new HttpPost("http://localhost/index.html") ;
request.setEntity(entity);

理解できません。上記のパスはすべてファイルのアップロード用に選択されています。コード
entity.addPart("param3", new FileBody(new File("C: \1.txt")));ファイルパスはすべてハードコーディングされているようです。ファイルアップロード用の新しい File() はないようです。コードはサーバー側にあるのに、どうやってこのように書くことができますか?
ユーザーがアップロードしたローカル コードはローカル パスです。サーバー側には間違いなくこのアドレスがありません。

自分で検証せずに上記のコードを書いていることさえ知りません。
解決​​方法を教えてください。これは問題ですか?
サーバー側のインターフェイスには multipart/form-data データが必要です。どのように記述すればよいですか?
HTTPclient の機能は、JSP でブラウザー、つまり HTTP プロトコルのクライアントをシミュレートすることです。ローカルサーバー上のファイルを
ブラウザ
のようなターゲットサーバーにアップロードすることです。つまり、新しいファイル(「C:\1.txt」)の問題は解決できますよね? C:\1.txt はローカルサーバー上のファイルです。もちろんファイル名は自分で決めます

multipart/form-data ステートメントに関しては、HttpPost のパラメータ MultipartEntity によって自動的に追加されます

必要なのは Web ページです サーバーにアップロードするには、サーバーはローカル ファイルをアップロードする代わりに、HTTPclient を使用して別のサービス インターフェイスを呼び出してアップロードします

このインターフェイスでは、multipart/form-data のみを送信できると規定されており、ブラウザーはここでアップロードされたファイル情報をバックエンド経由で渡します。取得後、インターフェイスに移動して保存を実行します。インターフェイスは操作などの各データを保存します。

このウィンドウにはアップロード機能があり、バックグラウンドで httpclient を使用してデータを転送する必要があります。ファイル ストリーム。HTTPclient を使用したことがないため、HTTPclient を使用して転送する方法がわかりません

アップロード関数ウィンドウ

要求されたデータをバックグラウンドにアップロードします


これは、に渡されるデータですバックグラウンド、今 httpclient でマルチパート /form-data を取得したいのですが、その方法がわかりません

リクエスト URL: http://localhost:8080/proxy/api/images/attachments/json/0/67 /0/0/-1?Type=Image&CKEditor=textEditor&CKEditorFuncNum=1&langCode =zh-cn
リクエスト ヘッダー 注意: 暫定ヘッダーが表示されます。
Accept:text/html,application/xhtml+xml,application/xml;q=0.9, image/webp,*/*;q=0.8
コンテンツタイプ:multipart/form-data; 境界=----WebKitFormBoundarysw8ttG9a1gakIbQt
発信元:http://localhost:8080
リファラー:http://localhost:8080/ user/kouht/editonline
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/34.0.1847.116 Safari/537.36
クエリ文字列パラメータビュー ソースビュー URL エンコード
Type:Image
CKEditor :textEditor
CKEd itorFuncNum:1
langCode:zh-cn
Request Payload
------WebKitFormBoundarysw8ttG9a1gakIbQt
Content-Disposition: form-data;
ブラウザでアップロードされたファイルは、受信後、自分のサーバーにアップロードされます。 HTTPclient を使用する必要があるのは、他のサーバーに送信する場合だけです。
これはリレーです。混乱しないでください。

ブラウザでアップロードされたファイルは、受信後、他のサーバーに送信するときにのみ HTTPclient を使用する必要があります。混同しないでください。


別のサーバーに直接転送することはできませんか?

いいえ!
ブラウザがファイルのアップロードを完了すると jsp が動作し始めるため

そして HTTPclient はブラウザをシミュレートしてファイルモードでファイルをアップロードするだけです
アップロードされたファイルのデータを jsp で受信し、同時に上位サーバーに送信したい場合
まず、独自のファイル受信プログラムを作成する必要があります。もう 1 つは、ソケットを使用して上位サーバーに送信することです。知識が多すぎて、しばらくは実行できません。いいえ!

ブラウザがファイルのアップロードを完了すると jsp が動作し始めるため

そして HTTPclient はブラウザをシミュレートしてファイルモードでファイルをアップロードするだけです
アップロードされたファイルのデータを jsp で受信し、同時に上位サーバーに送信したい場合
まず、独自のファイル受信プログラムを作成する必要があり、もう 1 つは、ソケットを使用して上位サーバーに送信することです
知識が多すぎて、すぐにはできないかもしれません


以前のコードを見たところ、それは可能であるようです。これは彼らが書いたものです

次のメソッドは、上記で説明したパスです リクエスト URL: http: //localhost : 8080/Proxy/API/Images/Attachments/JSON/0/67/0/0/-1? Type = Image & CKEditor = Texteditor & CKEDITORFUNCNUM = 1 & Langcode = zh-Cn
CTED VOID DOPOST (httpservletRequest) request, httpservletResponse 応答) {
String targerUrl =request.getRequestURI();
HttpProxy.request(request, response, targerUrl);//プロキシ リクエスト
}

/**
* プロキシリクエスト
*
* @param リクエスト
* - リクエスト
* @param レスポンス
* @param targetUrl - レスポンス
* @param targetUrl
* - ターゲットサーバーアドレス
* @param エンコード
* * - のエンコード形式ターゲットサーバー
* @return
* @throws IOException
*/
public static void request( HttpServletRequest request, HttpServletResponse response , String targetUrl) throws IOException {

// System.out.println("Enter Http proxy");

// ターゲット URL
if (null == targetUrl) {
throw new IOException("ターゲット サーバー アドレスがありません" );
}

// ターゲット サーバー アドレス
String url = null;

// ターゲット サーバー アドレスを取得し、ターゲット サーバーで中国語を再エンコードします
try {
url = ProxyUtils.rebuildURL2 (targetUrl, "utf -8");
} catch (Exception e) {
e.printStackTrace(); }

// リクエストパラメータ
Map<String, String> );

// リクエストヘッダー情報
Mapheaders = new HashMap();

// クライアントリクエストメソッド

logger.info ("[プロキシリクエスト]メソッド: " + メソッド + ": " + url);

// リクエストヘッダー情報の列挙を取得します
Enumeration<String> headersEnu = request.getHeaderNames(); )) {
// リクエストヘッダー名を取得します
String headerName = (String) headersEnu.nextElement();
headers.put(headerName.toLowerCase(), headerValue); logger. info("t[header] " + headerName + "=" + headerValue)
}

// 指定されたリクエストヘッダがある場合は、元のリクエストヘッダを上書きします
if (null != headerMap && headerMap.size () > 0) {
for (String key : headerMap.keySet()) {
headers.put(key.toLowerCase(), headerMap.get(key))
}
}
// パラメータキーを取得しますname
Enumeration<String> enu = request.getParameterNames();
while (enu.hasMoreElements()) {
// パラメータ名のリストを取得します
String paramName = (String) enu.nextElement();リクエストパラメータとサードパーティサーバーに送信されるパラメータ
String paramValue = request.getParameter(paramName)
params.put(paramName, paramValue);
logger.info("t[parameter] " + paramName + "=" + paramValue);
}

// Ajax プロキシを取得します
AjaxProxy proxy = ProxyFactory.getProxyInstance(method, url, params, headers)

// // リクエストボディ
// String requestBody = readFileByLines(request.getInputStream(); );
/ /
// System.out.println("n[requestBody]" + requestBody)

// Ajax プロキシ応答を取得します
AjaxResponse resp = null;// 投稿リクエストであり、フォームアップロード (multipart/form-data) の場合は、入力ストリームを渡します
String contentType = headers.get("content-type");
boolean isUpload = null != contentType && contentType.toLowerCase( ).indexOf("multipart/form-data") >= 0;

// 1. 要求されたリソースが画像の場合、結果を返すための応答としてストリームを直接使用します
String accept = headers.get("accept") ;
boolean useStream4response = null != accept ? (accept.indexOf("image/") >= 0) : true;

// 戻り値として常にストリームを使用します
useStream4response = true ;

if ("post" .equalsIgnoreCase(method) && isUpload) {
useStream4response = false;
// 画像のアップロード後に XML 形式のデータが返されることを期待します
headers.put("accept", "application/json" );
resp = proxy.getAjaxResponse(request.getInputStream());
// } else if ( "put".equalsIgnoreCase(method) && params.size() > 0 )
// {
// // put リクエストはパラメータを持ち、入力ストリームを渡します
// resp = proxy.getAjaxResponse(request.getInputStream())
} else if (useStream4response) {
OutputStream out = response.getOutputStream();
resp = proxy. getAjaxResponse(out);
out.flush();
} else {
resp = proxy.getAjaxResponse();

// メソッドを取得します
httpMethod = resp.getMethod();応答がない場合は null
if (null == httpMethod ) {
logger.info("[プロキシ リクエストが失敗しました] http code: " + resp.getStatusCode() + ": " + url);
return;
// 応答ヘッダーを取得します
Header[] respHheaders = httpMethod.getAllHeaders();
for (int i = 0, len = respHheaders.length; i Header header = respHheaders[i]; if (!isOverrideCookie && "Set-Cookie".equalsIgnoreCase(header .getName())) {
continue;
}
if ("content-type".equalsIgnoreCase(header.getName())) {
if ("post ".equalsIgnoreCase(method) && isUpload) {
// アップロードされた場合、contentType は上書きされません
response.setCharacterEncoding("utf-8");
continue;
}
}
response.setHeader(header.getName( ), header.getValue());
logger.info("t [応答ヘッダー] " + header.getName() + "=" + header.getValue());

// 出力
if (useStream4response) ) {
logger.info("リクエストアドレス: " + url + " n-----戻り結果: [ストリーム]");
} else {
PrintWriter out = response.getWriter()
String result = resp; .getContent();
out.print(result);
}
return;

この赤いコードを使用してアップロードしてください

彼の書いたとおりに成功しましたか?

彼のアイデアはまったく異なります。彼はプロキシ サーバーを作成しました
サーバーを使用してクライアント リクエストを作成します

プロキシ サーバーを作成するときは、ユーザー データを覗いてはいけないことに注意してください。これは職業倫理に反します

はい、これは成功です。覗き見はありません。これは、ブラウザによって要求されたすべての情報を取得し、プロキシを使用して再度要求し、再度要求する前にデータをそのままにしておきます

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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

期限切れの WeChat ファイルを復元する方法? 期限切れの WeChat ファイルは復元できますか? 期限切れの WeChat ファイルを復元する方法? 期限切れの WeChat ファイルは復元できますか? Feb 22, 2024 pm 02:46 PM

期限切れの WeChat ファイルを復元する方法? 期限切れの WeChat ファイルは復元できますか?

形式がサポートされていないか、ファイルが破損しているため、写真ではこのファイルを開けません 形式がサポートされていないか、ファイルが破損しているため、写真ではこのファイルを開けません Feb 22, 2024 am 09:49 AM

形式がサポートされていないか、ファイルが破損しているため、写真ではこのファイルを開けません

Windows 11/10 では削除の準備に時間がかかります Windows 11/10 では削除の準備に時間がかかります Feb 19, 2024 pm 07:42 PM

Windows 11/10 では削除の準備に時間がかかります

Tmp形式のファイルは削除できますか? Tmp形式のファイルは削除できますか? Feb 24, 2024 pm 04:33 PM

Tmp形式のファイルは削除できますか?

Quark Cloud Disk から Baidu Cloud Disk にファイルを転送するにはどうすればよいですか? Quark Cloud Disk から Baidu Cloud Disk にファイルを転送するにはどうすればよいですか? Mar 14, 2024 pm 02:07 PM

Quark Cloud Disk から Baidu Cloud Disk にファイルを転送するにはどうすればよいですか?

アップロード失敗、ファイルを空にすることはできません、一貫性のないエラー アップロード失敗、ファイルを空にすることはできません、一貫性のないエラー Feb 19, 2024 pm 01:21 PM

アップロード失敗、ファイルを空にすることはできません、一貫性のないエラー

0x80004005 エラー コードが表示された場合の対処方法 エディターは、0x80004005 エラー コードを解決する方法を説明します。 0x80004005 エラー コードが表示された場合の対処方法 エディターは、0x80004005 エラー コードを解決する方法を説明します。 Mar 21, 2024 pm 09:17 PM

0x80004005 エラー コードが表示された場合の対処方法 エディターは、0x80004005 エラー コードを解決する方法を説明します。

hiberfil.sys ファイルとは何ですか? hiberfil.sysは削除できますか? hiberfil.sys ファイルとは何ですか? hiberfil.sysは削除できますか? Mar 15, 2024 am 09:49 AM

hiberfil.sys ファイルとは何ですか? hiberfil.sysは削除できますか?

See all articles