httpclient I don’t know how to write it, I checked it online Most of them are copied by you and me and I copy you. This is how it is written on the Internet The jsp code is as follows enctype="multipart/form-data">
"/>
The acquired code is written like this
MultipartEntity entity = new MultipartEntity(); entity.addPart("param1", new StringBody("China", 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);
I don’t understand. The above paths are all selected for file upload, and they write code using entity.addPart(" param3", new FileBody( new File("C:\1.txt"))); The file paths are all hard-coded. It seems that there is no new File() for file upload! Because the code is on the server side, how could it be written like this? The local code uploaded by the user is a local path. The server side definitely does not have this address.
I don’t even know the above code and they just write it without verifying it themselves
Please help me, experts, how to solve this problem. The server-side interface requires the data multipart/form-data. How should I write it?
Reply to the discussion (solution)
You first understand what HTTPclient is used for The function of HTTPclient is to simulate a browser in jsp, that is, HTTP protocol Client (client) Your background code is to upload files on your local server to the target server like a browser So new File("C:\1.txt" ) problem can be solved, right? C:\1.txt is a file in your local server. Of course, the file name is determined by you
As for the multipart/form-data statement, it is automatically added by the parameter MultipartEntity of HttpPost
What I want is to upload web pages to the server. The server uses HTTPclient to call another service interface to upload, instead of uploading my local files
Because this interface stipulates that only multipart/form-data can be transmitted to the browser. The uploaded file information will be obtained through the background here and then transferred to the interface to perform the save. The interface will store the respective data of the operation, etc.
My page is like this. This window has an upload function. Submit it and submit it to the background. The background then uses httpclient to redirect to another interface server. You need to transfer the data there. The interface requires multipart/form- data This file stream, I don’t know how to use httpclient to transfer it now, because I haven’t used HTTPclient before
Upload function window
Upload the data requested to the background
This is the data passed to the background. Now I want httpclient to get multipart/form-data, but I don’t know how to do it
The file uploaded by your browser is uploaded to your own server. After receiving it, you only need to use HTTPclient when transmitting it to other servers. This is a relay, don't get confused!
The file uploaded by your browser is uploaded to your own server. After receiving it, you only need to use HTTPclient when sending it to other servers. This is a relay, don’t get confused!
Can’t it be transferred directly to another server?
No! Because jsp starts to work when the browser finishes uploading files And HTTPclient only simulates the browser and uploads files in file mode If you want to receive the data of the uploaded file in jsp while sending it to the superior If the server sends it firstly, you have to write the file receiving program yourself, and secondly, you have to use socket to send it to the upper-level server There is too much knowledge involved, and you will not be able to do it for a while
No! Because jsp starts to work when the browser finishes uploading files And HTTPclient only simulates the browser and uploads files in file mode If you want to receive the data of the uploaded file in jsp while sending it to the superior If the server sends it firstly, you have to write the file receiving program yourself, and secondly, you have to use socket to send it to the superior server There is too much knowledge involved, and you may not be able to do it for a while
It seems to be possible. I looked at their previous code and it is possible. It doesn’t need to be so troublesome. This is what they wrote
The following method is the path I mentioned above. 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); // Proxy request }
/** * Proxy request * * @param request * - Request * @param response * - Response * @param targetUrl * - Target Server Address * @param encoding * - Encoding format of the target server * @return * @throws IOException */ public static void request(HttpServletRequest request, HttpServletResponse response, String targetUrl) throws IOException {
// System.out.println("Enter Http proxy");
// Target url if (null == targetUrl) { throw new IOException("Missing target server address"); }
// Target server Address String url = null;
// Get the target server address and re-encode the Chinese in the target server try { url = ProxyUtils.rebuildURL2(targetUrl, "utf -8"); } catch (Exception e) { e.printStackTrace(); }
// Request parameters Map params = new HashMap();
// Request header information Map headers = new HashMap();
// Get Enumeration of request header information Enumeration headersEnu = request.getHeaderNames(); while (headersEnu.hasMoreElements()) { // Get the request header name String headerName = (String) headersEnu.nextElement(); String headerValue = request.getHeader(headerName); headers.put(headerName.toLowerCase(), headerValue); logger.info("t[header] " headerName " "=" headerValue); }
// If there is a specified request header, overwrite the original request header if (null != headerMap && headerMap.size() > 0) { for (String key : headerMap.keySet()) { headers.put(key.toLowerCase(), headerMap.get(key)); } } // Get the parameter key name Enumeration enu = request.getParameterNames(); while (enu.hasMoreElements()) { // Get the parameter name list String paramName = ( String) enu.nextElement(); // Process the parameters of this request and the parameters sent to the third-party server String paramValue = request.getParameter(paramName); params.put(paramName, paramValue); logger.info("t[parameter] " paramName "=" paramValue); }
// Get ajax proxy response AjaxResponse resp = null;
// If it is a post request and it is a form upload (multipart/form-data), pass the input stream String contentType = headers.get("content-type"); boolean isUpload = null != contentType && contentType.toLowerCase().indexOf("multipart/form-data") >= 0;
// 1. When the requested resource is an image, directly use the stream as the response to return the result String accept = headers.get("accept"); boolean useStream4response = null != accept ? (accept.indexOf("image/") >= 0) : true;
// Always use Stream as return value useStream4response = true;
if ("post".equalsIgnoreCase(method) && isUpload) { useStream4response = false; // Expect to return xml format after uploading the image Data headers.put("accept", "application/json"); resp = proxy.getAjaxResponse(request.getInputStream()); // } else if ( "put".equalsIgnoreCase( method) && params.size() > 0 ) // { // // put request, with parameters, pass input stream // resp = proxy.getAjaxResponse(request.getInputStream( )); } else if (useStream4response) { OutputStream out = response.getOutputStream(); resp = proxy.getAjaxResponse(out); out.flush(); } else { resp = proxy.getAjaxResponse(); }
// Get method HttpMessage httpMethod = resp.getMethod();
// When there is no response httpMethod is null if (null == httpMethod) { logger.info("[Proxy request failed] http code: " resp.getStatusCode() ": " url); return; }
// Get response headers 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) { // If uploading, contentType will not be overwritten response. setCharacterEncoding("utf-8"); continue; } } response.setHeader(header.getName(), header.getValue()); logger.info(" t[response header] " header.getName() "=" header.getValue()); }
// Output if (useStream4response) { logger.info(" Request address: " url "n-----Return result: [Stream]"); } else { PrintWriter out = response.getWriter(); String result = resp.getContent() ; out.print(result); } return; }
Use this red code to upload it
You follow what he wrote Was it successful?
His idea is completely different. He wrote a proxy server Use your server to make client requests
It should be noted that when writing a proxy server, do not Peep into user data. This is against professional ethics
Yes, this is successful. There is no peeking. This is equivalent to getting all the information requested by the browser and then using the proxy to request it again, leaving the data intact. Please request again
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn