MultipartEntity_html/css_WEB-ITnose を使用して HTTPclient でファイルをアップロードする方法
Jun 24, 2016 pm 12:01 PM 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 を使用する必要があるのは、他のサーバーに送信する場合だけです。
これはリレーです。混乱しないでください。
いいえ!
ブラウザがファイルのアップロードを完了すると jsp が動作し始めるため
アップロードされたファイルのデータを 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> );
// リクエストヘッダー情報
Map
// クライアントリクエストメソッド
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
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;
この赤いコードを使用してアップロードしてください
彼の書いたとおりに成功しましたか?
彼のアイデアはまったく異なります。彼はプロキシ サーバーを作成しました
サーバーを使用してクライアント リクエストを作成します
プロキシ サーバーを作成するときは、ユーザー データを覗いてはいけないことに注意してください。これは職業倫理に反します

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

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

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