1、推送附件 filebody
/** * 推送附件方法 * @param args */ public static void main2(String[] args){ CloseableHttpClient httpClient = null; CloseableHttpResponse response = null; try { httpClient = HttpClients.createDefault(); // 把一個普通參數和文件上傳給下面這個地址 是一個servlet HttpPost httpPost = new HttpPost("http://localhost:8088/api/xfSystemToJsxf/acceptOutSystemUpload"); // 請求頭設置token值 httpPost.setHeader("token", "8c17f4d7-c53a-42e3-aa22-8f3f8e41f25e"); StringBody extendId = new StringBody("705d7630-d097-4a4c-806e-61b0cd50ba2f", ContentType.create( "text/plain", "utf-8")); StringBody extendCaseCode = new StringBody("NJ12369", ContentType.create( "text/plain", "utf-8")); // 相當於<input type="text" name="extendId" value=extendId> MultipartEntityBuilder meb = MultipartEntityBuilder.create() .addPart("extendId", extendId) .addPart("extendCaseCode", extendCaseCode); List<FileBody> fileBodyList=new ArrayList<>(); fileBodyList.add(new FileBody(new File("C:\\Users\\wangmq\\Desktop\\附件1.docx"))); fileBodyList.add(new FileBody(new File("C:\\Users\\wangmq\\Desktop\\附件2.doc"))); for(int i=0; i<fileBodyList.size(); i++){ FileBody fileBody=fileBodyList.get(i); // 把文件轉換成流對象FileBody StringBody fileName = new StringBody(fileBody.getFilename(), ContentType.create( "text/plain", "utf-8")); meb.addPart("fileName"+i, fileName); meb.addPart("fileBody"+i, fileBody); } // setMode(HttpMultipartMode.RFC6532)解決文件名中文成?的問題 HttpEntity reqEntity = meb.setMode(HttpMultipartMode.RFC6532).build(); httpPost.setEntity(reqEntity); // 發起請求 並返回請求的響應 response = httpClient.execute(httpPost); System.out.println("響應狀態碼==========" + response.getStatusLine()); System.out.println("響應頭===========" + response.getLastHeader("fileResult")); // 獲取響應對象 HttpEntity resEntity = response.getEntity(); if (resEntity != null) { // 打印響應長度 System.out.println("Response content length: " + resEntity.getContentLength()); // 打印響應內容 System.out.println(EntityUtils.toString(resEntity, Charset.forName("UTF-8"))); } // 銷毀 EntityUtils.consume(resEntity); }catch (Exception e){ e.printStackTrace(); }finally { try { if(response != null){ response.close(); } } catch (IOException e) { e.printStackTrace(); } try { if(httpClient != null){ httpClient.close(); } } catch (IOException e) { e.printStackTrace(); } } }
2、接收推送的附件 filebody
@ResponseBody @RequestMapping(value = "/acceptJsxfManageFile", method = RequestMethod.POST) public JsonResult acceptJsxfManageFile(HttpServletRequest request, HttpServletResponse response){ JsonResult jsonResult = JsonResult.getSuccessResult(); try { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); // 開始保存附件 String jsxfManageFilePath = ConfigUtil.getConfigValueByKey("jsxfManageFilePath"); File uploadFile = new File(jsxfManageFilePath); if (!uploadFile.exists()) { uploadFile.mkdirs(); } // 檢測是不是存在上傳文件 boolean isMultipart = ServletFileUpload.isMultipartContent(request); if(isMultipart){ DiskFileItemFactory factory = new DiskFileItemFactory(); //指定在內存中緩存數據大小,單位為byte,這里設為50Mb factory.setSizeThreshold(50*1024*1024); //設置一旦文件大小超過getSizeThreshold()的值時數據存放在硬盤的目錄 factory.setRepository(new File("C:\\temp")); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // 指定單個上傳文件的最大尺寸,單位:字節,這里設為50Mb upload.setFileSizeMax(50 * 1024 * 1024); //指定一次上傳多個文件的總尺寸,單位:字節,這里設為99Mb upload.setSizeMax(99 * 1024 * 1024); upload.setHeaderEncoding("UTF-8"); List<FileItem> items = null; // 解析request請求 items = upload.parseRequest(request); // 外部系統案件主鍵id String extendId = ""; if(items!=null){ //解析表單項目 Iterator<FileItem> iter = items.iterator(); // MultipartEntityBuilder對象的addPart設置參數是有序的,就按照設置的先后自然順序排列 // 遍歷變化的fileStatus String fileStatusIter = ""; String fileNameIter = ""; int acceptFileNum = 0; while (iter.hasNext()) { FileItem item = iter.next(); //如果是普通表單屬性 if (item.isFormField()) { //相當於input的name屬性 <input type="text" name="content"> String name = item.getFieldName(); //input的value屬性 String value = item.getString(); if("extendId".equals(name)){ extendId = value; } // 設置遍歷變化的fileStatus if(name.indexOf("fileStatus")!=-1){ fileStatusIter = value; } // 設置遍歷變化的filename if(name.indexOf("fileName")!=-1){ fileNameIter = value; } } else { // 是文件,加一層文件夾路徑,文件夾名為外部系統案件主鍵id String uploadPathExtendId = jsxfManageFilePath+"\\"+extendId+"\\"; File uploadPathExtendIdDir = new File(uploadPathExtendId); if(!uploadPathExtendIdDir.exists()){ uploadPathExtendIdDir.mkdirs(); } //屬性名 String fieldName = item.getFieldName(); //上傳文件路徑 // String fileName = item.getName(); String fileName = fileNameIter; fileName = fileName.substring(fileName.lastIndexOf("/") + 1);// 獲得上傳文件的文件名 // 文件輸出流寫到本地硬盤保存 item.write(new File(uploadPathExtendIdDir, fileName)); acceptFileNum ++; // 插入中間庫案件和附件的關聯信息 if(systemService.addLocaleSurvey(fileStatusIter, extendId, uploadPathExtendId, fileName, ComplainContant.JSXF_MANAGE_FILE)){ jsonResult.setTotal(acceptFileNum); } } } } } }catch (Exception e){ jsonResult.setSuccess(false); e.printStackTrace(); }finally { return jsonResult; } }
3、j將自己文件打包,供別人獲取
@ResponseBody @RequestMapping(value = "takeOutSystemUpload") public void takeOutSystemUpload(@RequestBody DataSyncParam dataSyncParam, HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("multipart/form-data"); response.setCharacterEncoding("utf-8"); request.setCharacterEncoding("utf-8"); OutputStream out = response.getOutputStream(); ZipOutputStream zos = new ZipOutputStream(out); // 外部系統案件主鍵id String extendId = dataSyncParam.getExtendId(); try { if(StringUtils.isNullOrEmpty(extendId)){ response.setStatus(4003); response.setHeader("fileResult", "error, extendId is null"); }else{ // 根據extendid找到文件夾,遍歷獲取要打包的多個文件 String filePathNameDir = ConfigUtil.getConfigValueByKey("outSystemUploadPath")+extendId+"\\"; File[] fileArray = new File(filePathNameDir).listFiles(); if(fileArray == null){ response.setStatus(4004); response.setHeader("fileResult","error, extendId is invalid"); }else{ int takeFileNum = 0; for(File file : fileArray){ ZipEntry entry = new ZipEntry(file.getName()); zos.putNextEntry(entry); byte [] bytes = new byte[1024]; int len; FileInputStream in = new FileInputStream(file); while((len = in.read(bytes)) != -1) { zos.write(bytes, 0, len); } takeFileNum++; zos.closeEntry(); in.close(); } response.setStatus(200); response.setHeader("fileResult","success, return "+takeFileNum+" files successfully"); } } } catch (Exception e) { response.setStatus(-1); e.printStackTrace(); }finally { if(zos != null) { try { zos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
4、獲取打包的附件
public static void main4(String[] args){ CloseableHttpClient httpClient = null; CloseableHttpResponse response = null; Map<String, String> params = new HashMap<>(); String extendId = "705d7630-d097-4a4c-806e-61b0cd50ba2f"; params.put("extendId", extendId); //發送http請求,並處理返回的zip包 HttpPost httpPost = new HttpPost("http://localhost:8088/api/xfSystemToJsxf/takeJsxfManageFile"); httpPost.addHeader("token", "c279adad-0cb0-4d3c-9436-644d513c41fa"); MultipartEntityBuilder builder = MultipartEntityBuilder.create().setCharset(Charset.forName("utf-8")); String value = ""; if (params != null) { for (String key : params.keySet()) { value = (String)params.get(key); if (value == null) value = ""; builder.addTextBody(key, value, ContentType.APPLICATION_JSON); } } HttpEntity multipart = builder.setMode(HttpMultipartMode.RFC6532).build(); httpPost.setEntity(multipart); Map<String, Object> map = new HashMap<>(); try { httpClient = HttpClients.createDefault(); response = httpClient.execute(httpPost); String[] statusLineArray = response.getStatusLine().toString().split(" "); System.out.println("響應狀態嗎===========" + response.getStatusLine()); System.out.println("響應頭===========" + response.getLastHeader("fileResult")); if("200".equals(statusLineArray[1])){ try { HttpEntity entity = response.getEntity();//從response里獲取數據實體 InputStream in = entity.getContent();//獲取數據流 Charset c = Charset.forName("UTF-8"); ZipInputStream zin = new ZipInputStream(in, c);//封裝成zip輸入流 BufferedOutputStream bos = null; ZipEntry ze; // // 加一層文件夾路徑,文件夾名為外部系統案件主鍵id String path = "C:\\Users\\wangmq\\Desktop\\outSystemManageFile\\"+extendId+"\\"; File filePathDir = new File(path); if(!filePathDir.exists()){ filePathDir.mkdirs(); } File file = null; while((ze = zin.getNextEntry()) != null) {//循環zip輸入流,獲取每一個文件實體 file = new File(path + ze.getName());//生成file(如果文件路徑不存在,先創建) FileOutputStream fos = new FileOutputStream(file); int len; byte [] bytes = new byte[2048]; bos = new BufferedOutputStream(fos,2048); while((len = zin.read(bytes, 0, 2048)) != -1) { bos.write(bytes, 0, len); } bos.flush(); bos.close(); } zin.close();//關閉輸入流 }catch(Exception e){ e.printStackTrace(); } finally { if (response != null) response.close(); } } } catch (IOException e) { logger.error("獲取附件發送異常" + e); } }