
jsp HTTPclient MultipartEntity multipart/form-data
jsp 頁面上傳文件代碼:
httpclient 不知道怎么寫,
網上查了一大堆都是你抄我我抄你的,
網上都是這么寫的
jsp 代碼是下面這樣的
后天代碼都是這樣寫的
MultipartEntity entity = new MultipartEntity();
entity.addPart("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")));
文件路徑都是寫死的,文件上傳貌似是沒有這個new File()的吧!因為代碼在服務器端,怎么可能會這么寫呢?
用戶上傳自己本地的代碼是本地的路徑,服務器邊這邊肯定是沒這個地址的,
我都不知道上面這些代碼他們自己都不去驗證就往上寫
求高手們幫幫忙,這個問題怎么解決,
服務器端的接口要的就是multipart/form-data這個數據,我該怎么寫
回復討論(解決方案)
你先搞清楚 HTTPclient 是做什么用的
HTTPclient 的作用是在 jsp 中模擬一個瀏覽器,即 HTTP 協議的客戶端(client)
你的后臺代碼是將你本地服務器上的文件 像瀏覽器那樣上傳到目標服務器
于是 new File("C:\\1.txt") 的問題就可以解決了吧?C:\\1.txt 是你本地服務器中的文件,當然文件名是你自己定的
至于 multipart/form-data 聲明,那是由 HttpPost 的參數 MultipartEntity 自動加上的
我要的就是網頁上傳到服務器,服務器使用HTTPclient 調用另一個服務接口上傳,并不是上傳我本地文件
因為這個接口規定了只能傳multipart/form-data,瀏覽器那邊會把上傳的文件信息通過這邊后臺獲取后再轉向接口那邊去執行保存,接口那邊存放操作各自數據等
我的頁面是這樣的,這個窗口有上傳功能,進行提交,提交到后臺,后臺再使用httpclient轉向另一個接口服務器,需要把這些數據傳過去,接口那邊要的是multipart/form-data 這個文件流,我現在不知道怎么使用httpclient傳過去,因為我以前沒用功HTTPclient
上傳功能窗口
上傳請求到后臺的數據
這就是傳給后臺的數據,現在是想要httpclient獲取multipart/form-data,不知道怎么做
Request URL:http://localhost:8080/proxy/api/images/attachments/json/0/67/0/0/-1?Type=Image&CKEditor=textEditor&CKEditorFuncNum=1&langCode=zh-cn
Request Headers CAUTION: Provisional headers are shown.
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Content-Type:multipart/form-data; boundary=----WebKitFormBoundarysw8ttG9a1gakIbQt
Origin:http://localhost:8080
Referer:http://localhost:8080/user/kouht/editonline
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36
Query String Parametersview sourceview URL encoded
Type:Image
CKEditor:textEditor
CKEditorFuncNum:1
langCode:zh-cn
Request Payload
------WebKitFormBoundarysw8ttG9a1gakIbQt
Content-Disposition: form-data; name="upload"; filename="menu.png"
Content-Type: image/png
------WebKitFormBoundarysw8ttG9a1gakIbQt--
你瀏覽器上傳文件是上傳到你自己的服務器,你接收后在傳到其他服務器時,才需要用 HTTPclient
這是接力,不要搞混了!
你瀏覽器上傳文件是上傳到你自己的服務器,你接收后在傳到其他服務器時,才需要用 HTTPclient
這是接力,不要搞混了!
不能直接傳到另一個服務器嗎
不能!
因為瀏覽器上傳文件結束時,jsp 才開始工作
而 HTTPclient 只是模擬了瀏覽器,也是文件方式上傳文件
如果你想在 jsp 中一邊接收上傳文件的數據,一邊向上級服務器發送的話
一是要你自己寫文件接收程序,二是要用 socket 向上級服務器發送
涉及的知識太多,你一時半會是搞不起來的
不能!
因為瀏覽器上傳文件結束時,jsp 才開始工作
而 HTTPclient 只是模擬了瀏覽器,也是文件方式上傳文件
如果你想在 jsp 中一邊接收上傳文件的數據,一邊向上級服務器發送的話
一是要你自己寫文件接收程序,二是要用 socket 向上級服務器發送
涉及的知識太多,你一時半會是搞不起來的
好像是可以的,我看了下他們以前的代碼,是可以的,不需要那么麻煩,他們是這么寫的
下面這個方法就是我上面說的那個路徑 Request URL:http://localhost:8080/proxy/api/images/attachments/json/0/67/0/0/-1?Type=Image&CKEditor=textEditor&CKEditorFuncNum=1&langCode=zh-cn
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String targerUrl =request.getRequestURI();
HttpProxy.request(request, response, targerUrl);// 代理請求
}
/**
* 代理請求
*
* @param request
* - 請求
* @param response
* - 響應
* @param targetUrl
* - 目標服務器地址
* @param encoding
* - 目標服務器的編碼格式
* @return
* @throws IOException
*/
public static void request(HttpServletRequest request, HttpServletResponse response, String targetUrl) throws IOException {
// System.out.println("進入Http代理");
// 目標url
if (null == targetUrl) {
throw new IOException("缺少目標服務器地址");
}
// 目標服務器地址
String url = null;
// 獲取目標服務器地址,并對目標服務器中的中文進行重新編碼
try {
url = ProxyUtils.rebuildURL2(targetUrl, "utf-8");
} catch (Exception e) {
e.printStackTrace();
}
// 請求參數
Map
params = new HashMap();
// 請求頭部信息
Map headers = new HashMap();
// 客戶端請求方式
String method = request.getMethod();
logger.info("[代理請求] method: " + method + ": " + url);
// 獲取請求頭部信息的枚舉
Enumeration headersEnu = request.getHeaderNames();
while (headersEnu.hasMoreElements()) {
// 取得請求頭部名稱
String headerName = (String) headersEnu.nextElement();
String headerValue = request.getHeader(headerName);
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));
}
}
// 獲取參數鍵值名稱
Enumeration enu = request.getParameterNames();
while (enu.hasMoreElements()) {
// 取得參數名稱列表
String paramName = (String) enu.nextElement();
// 處理本請求參數以及發送給第三方服務器的參數
String paramValue = request.getParameter(paramName);
params.put(paramName, paramValue);
logger.info("\t[參數] " + paramName + "=" + paramValue);
}
// 取得ajax代理
AjaxProxy proxy = ProxyFactory.getProxyInstance(method, url, params, headers);
// // 請求body
// String requestBody = readFileByLines(request.getInputStream());
//
// System.out.println("\n[requestBody]" + requestBody);
// 獲取ajax代理響應
AjaxResponse resp = null;
// 若是post請求,且屬于表單上傳時(multipart/form-data),傳遞input流
String contentType = headers.get("content-type");
boolean isUpload = null != contentType && contentType.toLowerCase().indexOf("multipart/form-data") >= 0;
// 1,當請求的資源是圖片時,直接使用流作為response返回結果
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請求, 且具有參數, 傳遞input流
// resp = proxy.getAjaxResponse(request.getInputStream());
} else if (useStream4response) {
OutputStream out = response.getOutputStream();
resp = proxy.getAjaxResponse(out);
out.flush();
} else {
resp = proxy.getAjaxResponse();
}
// 取得方法
HttpMessage httpMethod = resp.getMethod();
// 無響應時httpMethod為null
if (null == httpMethod) {
logger.info("[代理請求失敗] http code: " + resp.getStatusCode() + ": " + url);
return;
}
// 取得響應頭部
Header[] respHheaders = httpMethod.getAllHeaders();
for (int i = 0, len = respHheaders.length; i < len; 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[response header] " + header.getName() + "=" + header.getValue());
}
// 輸出
if (useStream4response) {
logger.info("請求地址: " + url + "\n-----返回結果: [Stream]");
} else {
PrintWriter out = response.getWriter();
String result = resp.getContent();
out.print(result);
}
return;
}
用這個紅色的代碼給上傳上去了 你按他寫的成功了嗎?
他的思路是完全不同的,他是寫了一個代理服務器
用你的服務器中站客戶端請求
需要注意的是,寫代理服務器時,不要窺視用戶數據。這是有違職業道德的
對,這個就成功了,沒有窺視,他這就是相當于把瀏覽器請求的信息全部拿到再去用代理請求一次,把數據原封不動的再去請求
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com