zoukankan      html  css  js  c++  java
  • 小程序文件上传uploadFile

    前台代码:

    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.   
    5.         <property name="maxUploadSize" value="2000000000" />  
    6.     </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.             }  
    11.         } catch (Exception e) {  
    12.             e.printStackTrace();  
    13.         }  
    14.           
    15.     }  

    方式二

    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.             }  
    9.   
    10.         } catch (Exception e) {  
    11.             e.printStackTrace();  
    12.         }  
    13.         return "upload";  
    14.     }  
    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.   
    6.         <property name="maxUploadSize" value="2000000000" />  
    7.     </bean>  
    8.      -->  
    在控制器里面自己完成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.                       
    9.                 }else{  
    10.                     //item.write(new File(""));  
    11.                 }  
    12.             }  
    13.         } catch (FileUploadException e) {  
    14.             e.printStackTrace();  
    15.         }  
    16.           
    17.     }  

    2)如果是需要使用的ProgressListener监听器我们可以重写 CommonsMultipartResolver的parseRequest方法

     

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

    监听器方法 

     
    1. import org.apache.commons.fileupload.ProgressListener;  
    2.   
    3. public class FileUploadListener implements ProgressListener {  
    4.   
    5.     @Override  
    6.     public void update(long arg0, long arg1, int arg2) {  
    7.         //arg0 已经上传多少字节  
    8.         //arg1 一共多少字节  
    9.         //arg2 正在上传第几个文件  
    10.         System.out.println(arg0 +" " + arg1 +" " + arg2);  
    11.     }  
    12.       
    13. }  

    配置文件改为我们自己的(这种方式的缺陷是,所有文件上传都需要使用到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前段可以使用假的进度条或者是上面的两种方式.

  • 相关阅读:
    ildasm ilasm的使用,并汉化软件
    Rectangle.Inflate
    cookie 老丢失
    div高度自适应
    css li 空隙问题
    jquery 提交乱码问题
    VS2010创建并使用DLL
    建网站的问题
    Delphi中本年、本月、本周第一天和最后一天
    DLL(OCX)文件注册与反注册方法(regsvr32用法)
  • 原文地址:https://www.cnblogs.com/kongxc/p/9195049.html
Copyright © 2011-2022 走看看