u010428589 2013-07-03 07:11 采纳率: 100%
浏览 17724
已采纳

用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 2013-12-19 07:46
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 MATLAB代码求涡量
  • ¥100 采用栈和深度优先算法对我的代码进行修改显示路径
  • ¥15 pointnet2包安装
  • ¥20 射频功率问题,解答者有酬谢!
  • ¥80 构建降雨和积水的预测模型
  • ¥15 #Qt Transform setTransform()在鼠标拖动移动视角是一致在原地不动,无法变换视角(细微观察似乎视图有在原地抖动),无法变换视角(细微观察似乎视图有在原地抖动)
  • ¥50 如何利用无人机拍摄的数码照片测量鸟卵的长短径
  • ¥100 github贡献者给与奖励
  • ¥15 使用DS18B20+ESP8266获取温度数据返回-127.00
  • ¥15 odbc代码新增sqlserver数据源