赞
踩
之前一直在用的是已经封装好的http工具类,公司最近接了一个二期项目,人家原来的图片含有中文路径,导致图片在从客户端往服务端传的时候一直报错!
先附上之前使用的上传文件方法:
/** * 上传文件 * @param requestMap 双传文件的信息 * @param filePath * @return */ public String methodUploadFile(Map<String, String> headerMap,Map<String, String> requestMap) { String urlStr = headerMap.get("requestURL"); if(!urlStr.endsWith("?")) { urlStr = urlStr + "?" ; } for (Iterator iterator = requestMap.entrySet().iterator(); iterator.hasNext();) { Entry me = (Entry) iterator.next(); String key = me.getKey() + "" ; String val = me.getValue() + "" ; urlStr = urlStr + "&" + key + "=" + val ; } /* 返回值 */ StringBuffer sbRes = new StringBuffer() ; String filePath = requestMap.get("filePath"); try { // 换行符 final String newLine = "\r\n"; final String boundaryPrefix = "--"; // 定义数据分隔线 String BOUNDARY = "========7d4a6d158c9"; // 服务器的域名 URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置为POST请求 conn.setRequestMethod("POST"); // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); // 设置请求头参数 conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("Charsert", "UTF-8"); conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); OutputStream out = new DataOutputStream(conn.getOutputStream()); // 上传文件 File file = new File(filePath); StringBuilder sb = new StringBuilder(); sb.append(boundaryPrefix); sb.append(BOUNDARY); sb.append(newLine); // 文件参数,photo参数名可以随意修改 sb.append("Content-Disposition: form-data;name=\"file\";filename=\"" + filePath + "\"" + newLine); sb.append("Content-Type:application/octet-stream"); // 参数头设置完以后需要两个换行,然后才是参数内容 sb.append(newLine); sb.append(newLine); // 将参数头的数据写入到输出流中 out.write(sb.toString().getBytes()); // 数据输入流,用于读取文件数据 DataInputStream in = new DataInputStream(new FileInputStream(file)); byte[] bufferOut = new byte[1024]; int bytes = 0; // 每次读1KB数据,并且将文件数据写入到输出流中 while ((bytes = in.read(bufferOut)) != -1) { out.write(bufferOut, 0, bytes); } // 最后添加换行 out.write(newLine.getBytes()); in.close(); // 定义最后数据分隔线,即--加上BOUNDARY再加上--。 byte[] end_data = (newLine + boundaryPrefix + BOUNDARY + boundaryPrefix + newLine).getBytes(); // 写上结尾标识 out.write(end_data); out.flush(); out.close(); // 定义BufferedReader输入流来读取URL的响应 BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = null; while ((line = reader.readLine()) != null) { sbRes.append(line); } } catch (Exception e) { ConstatFinalUtil.LOGGER.error("上传文件失败了;文件名:{}",filePath , e); } return sbRes.toString() ; }
刚开始一度以为是编码的问题,可是把客户端和服务端的代码都查了一遍,都有做编码和解码。可在上传的时候还是报错。
后来找到了一个上传的方法,测试可以,就封装起来用这个来上传:
public String fileUpload(Map<String, String> requestMap) throws ClientProtocolException, IOException { CloseableHttpClient httpClient = HttpClients.createDefault(); try { // 要上传的文件的路径 String filePath = new String(requestMap.get("filePath")); // 把一个普通参数和文件上传给下面这个地址 是一个servlet HttpPost httpPost = new HttpPost(requestMap.get("requestURL")); // 把文件转换成流对象FileBody File file = new File(filePath); FileBody bin = new FileBody(file); // StringBody userId = new StringBody("用户ID", ContentType.create("text/plain", Consts.UTF_8)); //以浏览器兼容模式运行,防止文件名乱码。 //这里是放一些你要传的参数,例如验证身份的公私钥或者方法名之类的。 HttpEntity reqEntity = MultipartEntityBuilder.create().setMode(HttpMultipartMode.BROWSER_COMPATIBLE).addPart("file", bin) .addTextBody("name", requestMap.get("name")).addTextBody("fileName", requestMap.get("fileName")).addTextBody("jlbh", requestMap.get("jlbh")).setCharset(CharsetUtils.get("UTF-8")) .build(); httpPost.setEntity(reqEntity); System.out.println("发起请求的页面地址 " + httpPost.getRequestLine()); // 发起请求 并返回请求的响应 CloseableHttpResponse response = httpClient.execute(httpPost); try { // 获取响应对象 HttpEntity resEntity = response.getEntity(); if (resEntity != null) { String resp = EntityUtils.toString(resEntity, Charset.forName("UTF-8")); return resp; } // 销毁 EntityUtils.consume(resEntity); } finally { response.close(); } } finally { httpClient.close(); } return null; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。