1. 程式人生 > >小程序文件上傳uploadFile

小程序文件上傳uploadFile

har 獲得 處理 gets tac ems filelist 設置 getname

前臺代碼:

bindPhoto(e) { var that = this; wx.chooseImage({ count: 1, sizeType: [‘original‘,‘compressed‘],// 指定原圖或者壓縮圖 sourceType: [‘album‘, ‘camera‘], // 指定圖片來源 success: function (res) { var tempFilePaths = res.tempFilePaths; wx.uploadFile({ url: ‘http://192.168.31.111:8007/goods/wx_upload.do‘, filePath: tempFilePaths[0], name: ‘file‘, header: { "Content-Type": "multipart/form-data" }, formData:{ ‘session_token‘: token }, success:function(res){ var cur_data = res.data; console.log(cur_data.fileName); }, fail: function (res) { console.log(‘上傳失敗‘); } }) } }) }, 後臺代碼
/*
微信小程序上傳圖片測試*/ @RequestMapping("wx_upload.do") public void wx_upload(HttpServletRequest request, HttpServletResponse response) throws Exception { request.setCharacterEncoding("utf-8"); //設置編碼 //獲得磁盤文件條目工廠 DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); String fileId = null; String json = "{\"success\":false,\"fileName\":\"" + fileId + "\"}"; String pathUrl = FSDefaultMgr.E_DEFAULT
.getDefaultUploadPathUrl();//獲取圖片服務器路徑 InputStream inStream = null; try { //可以上傳多個文件 List<FileItem> list = (List<FileItem>)upload.parseRequest(request); for(FileItem item : list){ //獲取表單的屬性名字 String name = item.getFieldName(); //如果獲取的 表單信息是普通的 文本 信息 if(item.isFormField()){ //
獲取用戶具體輸入的字符串 ,名字起得挺好,因為表單提交過來的是 字符串類型的 String value = item.getString() ; request.setAttribute(name, value); }else { //獲取路徑名 String filename = item.getName(); request.setAttribute(name, filename); inStream = item.getInputStream() ; } } ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); byte[] buff = new byte[100]; int rc = 0; while ((rc = inStream.read(buff, 0, 100)) > 0) { swapStream.write(buff, 0, rc); } byte[] bytes = swapStream.toByteArray(); fileId = FastDFSClient.uploadFile(bytes, "20161545454.png", null); if (fileId != null) { json = "{\"success\":true,\"pathUrl\":\"" + pathUrl + "\",\"fileName\":\"" + fileId + "\"}"; } response.getWriter().write(json); response.getWriter().flush(); response.getWriter().close(); }catch (Exception e) { e.printStackTrace(); } }



當使用的是springMVC框架時:

SpringMVC中servletFileUpload.parseRequest(request)解析為空獲取不到數據問題

原因分析

首先我們來看下Spring mvc 中文件上傳的配置


  1. <bean id="multipartResolver"
  2. class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  3. <property name="defaultEncoding" value="UTF-8" />
  4. <property name="maxUploadSize" value="2000000000" />
  5. </bean>

再來看看Controller中使用

  1. public void upload2(HttpServletRequest request) {
  2. // 轉型為MultipartHttpRequest
  3. try {
  4. MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
  5. List<MultipartFile> fileList = multipartRequest.getFiles("file");
  6. for (MultipartFile mf : fileList) {
  7. if(!mf.isEmpty()){
  8. }
  9. }
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }
  13. }

方式二

  1. public String upload(HttpServletRequest request,
  2. @RequestParam(value = "file") MultipartFile[] files) {
  3. try {
  4. for (MultipartFile mf : files) {
  5. if(!mf.isEmpty()){
  6. }
  7. }
  8. } catch (Exception e) {
  9. e.printStackTrace();
  10. }
  11. return "upload";
  12. }
  1. 這裏springMVC 都為我們封裝好成自己的文件對象了,轉換的過程就在我們所配置的CommonsMultipartResolver這個轉換器裏面下面再來看看它的源碼技術分享圖片

他的轉換器裏面就是調用common-fileupload的方式解析,然後再使用parseFileItems()方法封裝成自己的文件對象 .

List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);

大家應該發現了上面的這句代碼,已經使用過fileUpload解析過request了,你在Controller裏面接收到的request都已經是解析過的,你再次使用upload進行解析獲取到的肯定是空,這個就是問題的所在(大家可以在servlet裏面實驗,看看第二次解析後能不能獲取到數據,當然是不能的)

解決方案

1)刪除Spring MVC文件上傳配置

  1. <!--
  2. <bean id="multipartResolver"
  3. class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  4. <property name="defaultEncoding" value="UTF-8" />
  5. <property name="maxUploadSize" value="2000000000" />
  6. </bean>
  7. -->
在控制器裏面自己完成request的解析(當然上面spring MVC提供的兩種方法是不能用的,所有上傳的地方都需要自己做處理)

  1. public void upload3(HttpServletRequest request) {
  2. DiskFileItemFactory factory = new DiskFileItemFactory();
  3. ServletFileUpload upload = new ServletFileUpload(factory);
  4. try {
  5. List<FileItem> list = upload.parseRequest(request);
  6. for(FileItem item : list){
  7. if(item.isFormField()){
  8. }else{
  9. //item.write(new File(""));
  10. }
  11. }
  12. } catch (FileUploadException e) {
  13. e.printStackTrace();
  14. }
  15. }

2)如果是需要使用的ProgressListener監聽器我們可以重寫 CommonsMultipartResolver的parseRequest方法

  1. package com.lwp.spring.ext;
  2. import java.util.List;
  3. import javax.servlet.http.HttpServletRequest;
  4. import org.apache.commons.fileupload.FileItem;
  5. import org.apache.commons.fileupload.FileUpload;
  6. import org.apache.commons.fileupload.FileUploadBase;
  7. import org.apache.commons.fileupload.FileUploadException;
  8. import org.apache.commons.fileupload.servlet.ServletFileUpload;
  9. import org.springframework.web.multipart.MaxUploadSizeExceededException;
  10. import org.springframework.web.multipart.MultipartException;
  11. import org.springframework.web.multipart.commons.CommonsMultipartResolver;
  12. import com.lwp.listener.FileUploadListener;
  13. public class CommonsMultipartResolverExt extends CommonsMultipartResolver {
  14. @Override
  15. protected MultipartParsingResult parseRequest(HttpServletRequest request)
  16. throws MultipartException {
  17. FileUploadListener listener = new FileUploadListener();
  18. String encoding = determineEncoding(request);
  19. FileUpload fileUpload = prepareFileUpload(encoding);
  20. fileUpload.setProgressListener(listener);
  21. try {
  22. List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
  23. return parseFileItems(fileItems, encoding);
  24. }
  25. catch (FileUploadBase.SizeLimitExceededException ex) {
  26. throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);
  27. }
  28. catch (FileUploadException ex) {
  29. throw new MultipartException("Could not parse multipart servlet request", ex);
  30. }
  31. }
  32. }

監聽器方法

  1. import org.apache.commons.fileupload.ProgressListener;
  2. public class FileUploadListener implements ProgressListener {
  3. @Override
  4. public void update(long arg0, long arg1, int arg2) {
  5. //arg0 已經上傳多少字節
  6. //arg1 一共多少字節
  7. //arg2 正在上傳第幾個文件
  8. System.out.println(arg0 +"\t" + arg1 +"\t" + arg2);
  9. }
  10. }

配置文件改為我們自己的(這種方式的缺陷是,所有文件上傳都需要使用到Listener)

  1. <bean id="multipartResolver"
  2. class="com.lwp.spring.ext.CommonsMultipartResolverExt">
  3. <property name="defaultEncoding" value="UTF-8" />
  4. <property name="maxUploadSize" value="2000000000" />
  5. </bean>

註: 綜上所述,如果只是普通的文件上傳spring MVC 完全可以完成,如果需要使用進度條的listener前段可以使用假的進度條或者是上面的兩種方式.

小程序文件上傳uploadFile