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

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

WBOY
WBOYオリジナル
2016-06-24 12:01:081344ブラウズ

jsp HTTPclient MultipartEntity multipart/form-data

jsp ページのアップロード ファイル コード:





httpclient 書き方がわかりません
インターネットでたくさん調べましたが、どれも私をコピーし、私もあなたのコピーをしました
これはすべてインターネット上でこのように書かれています。JSPコードは次のとおりです
< form action = "http://localhost/index.html" method = "post"
name = "param1" balue = "china"/ >

"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 );

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

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

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

// リクエストヘッダー情報の列挙を取得します
Enumeration 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 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 までご連絡ください。