2 u010428589 u010428589 于 2013.07.03 15:11 提问

用springMVC框架做文件上传时遇到问题

我是基于red5服务器。来用springMVC框架做文件上传。在上传文件时遇到错误。

@RequestMapping(value = "/upload.do",method = RequestMethod.POST)
public String upload(HttpServletRequest request,
        HttpServletResponse response, String string) {
    System.out.println("==================run in import");
    System.out.println("--------------" + request.getParameter("upload"));

    // 创建一个通用的多部分解析器.
    CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(
            request.getSession().getServletContext());
    // 设置编码
    commonsMultipartResolver.setDefaultEncoding("utf-8");
    System.out.println("++++++commonsMultipartResolver.isMultipart(request) : " + commonsMultipartResolver.isMultipart(request));
    // 判断是否有文件上传
    if (commonsMultipartResolver.isMultipart(request)) {
        MultipartHttpServletRequest multipartRequest = commonsMultipartResolver
                .resolveMultipart(request);

        Iterator<String> iter = multipartRequest.getFileNames();
        System.out.println("+++++++++++iter = "+iter.toString());
        // iter里面没有值
        while (iter.hasNext()) {
            MultipartFile file = multipartRequest.getFile((String) iter.next());
            if (file != null) {
                File localFile = new File("/WEB-INF/upload"
                        + file.getOriginalFilename());
                try {
                    // file.transferTo(localFile);
                    System.out.println("=======1111111111111====");
                    file.transferTo(localFile);
                    System.out.println("====222222222222222=======");
                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    // 批量上传
    // Map<String, MultipartFile> fileMap = request.getFileMap();
    // for(Entry<String, MultipartFile> entry : fileMap.entrySet()){
    // MultipartFile file = entry.getValue();
    // try {
    // file.transferTo(new File("/WEB-INF/upload" +
    // file.getOriginalFilename()));
    // } catch(IllegalStateException e){
    // e.printStackTrace();
    // }catch (Exception e) {
    // // TODO: handle exception
    // e.printStackTrace();
    // }
    // }
    return "up";
}

}

上传文件后,在我指定的地方没有找到文件。测试发现
if (commonsMultipartResolver.isMultipart(request)) 这个地方获得的是false,我这个action没有接收到上传的文件,但是通过System.out.println("--------------" + request.getParameter("upload"));获取到了我上传文件的文件名。
通过上网查找,我在配置文件中配置了MultipartResolver处理器
<!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 -->

<!-- 指定所上传文件的总大小不能超过200KB。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->

<!-- SpringMVC在超出上传文件限制时,会抛出org.springframework.web.multipart.MaxUploadSizeExceededException --> 
<!-- 该异常是SpringMVC在检查上传的文件信息时抛出来的,而且此时还没有进入到Controller方法中 --> 
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
    <property name="exceptionMappings"> 
        <props> 
            <!-- 遇到MaxUploadSizeExceededException异常时,自动跳转到/WEB-INF/jsp/error_fileupload.jsp页面 --> 
            <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">error_fileupload</prop> 
        </props> 
    </property> 
</bean> 

如果我在代码最上面写
MultipartHttpServletRequest rrr = (MultipartHttpServletRequest) request;
他就会报转化错误
java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest

不知道现在是什么问题,求解啊!

2个回答

rain_man_happy
rain_man_happy   2013.12.19 15:46
已采纳

SpringMVC里面有个专门处理文件上传的请求参数(好像叫MultilePart什么),但是到达upload函数时,Spring自身已经吧临时文件储存到本地了,所以文件比较大就悲剧了,需要拷贝一次。 文件较大时,建议直接用Servlet处理,可以参考Stream 上传插件: http://www.twinkling.cn/

Piggyci
Piggyci   2013.11.06 15:54

你前台的

标签上要加上传递附件的声明

enctype就是对上传附件的声明 不然后台就会因为无法匹配附件资源 无法解析 而造成转换的异常

form标签 加上 enctype="multipart/form-data" 属性

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!