SpringMVC利用IE上传文件,文件消失

Little5 2020-03-06 03:56:33
各位大佬,你们好。
小弟最近学习SpringMVC上传文件的时候,碰到一个很棘手的问题。

利用IE上传文件,出现异常。(form表单没问题,同样的代码,我用Chrome上传成功,没有异常)。显示文件拒绝访问(权限肯定是没问题的。)并且源文件消失。源文件夹和上传目录里都没有,IE出现一个下载框,内容是一个json页面。我在硬盘搜索后发现源文件路径还是原来的。不过看不见。也不是隐藏文件,变成下面这样了。打不开了。搞笑的是,我前天用同样的代码,同样的方式,用IE上传成功
和文件名、路径是否有中文无关,我都试过,问题一样的。


异常截图如下:



我用的是java config类来配置的。如果用xml配置,问题一样,只是没有
org.springframework.web.multipart.MultipartException: Current request is not a multipart request
这个异常
,请教大佬们,怎么回事?
代码配置如下:

RootConfig.class
package com.spring16.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ImportResource;
import org.springframework.stereotype.Controller;

@Configuration
// 配置扫描路径,管理除了controller以外的其他内容
@ComponentScan(value = "com.spring16",
excludeFilters = { @Filter(type = FilterType.ANNOTATION, classes = Controller.class) })
@ImportResource("/WEB-INF/applicationContext.xml")
public class RootConfig
{

}

WebMvcConfig.class
package com.spring16.config;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.FilterType;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Controller;
import org.springframework.web.multipart.support.StandardServletMultipartResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;


// 配置包扫描,只管理和controller有关的类
@ComponentScan(value = "com.spring16",
includeFilters = { @Filter(type = FilterType.ANNOTATION, value = Controller.class) })
// 启用MVC注解驱动,相当于<mvc:annotation-driven/>
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer
{
// 配置jsp视图解析器
@Bean
public InternalResourceViewResolver viewResolver()
{
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/jsp");
viewResolver.setSuffix(".jsp");
return viewResolver;
}

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters)
{
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
List<MediaType> mediaTypes = new ArrayList<>();
MediaType type = new MediaType(MediaType.TEXT_HTML, StandardCharsets.UTF_8);
mediaTypes.add(type);
type = new MediaType(MediaType.APPLICATION_JSON, StandardCharsets.UTF_8);
mediaTypes.add(type);

jsonConverter.setSupportedMediaTypes(mediaTypes);

converters.add(jsonConverter);
}

}

WebAppInit.class
package com.spring16.config;

import javax.servlet.Filter;
import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration.Dynamic;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

@Configuration
public class WebAppInit extends AbstractAnnotationConfigDispatcherServletInitializer
{
@Override
protected Class<?>[] getRootConfigClasses()
{
return new Class<?>[] { RootConfig.class };
}

// 指定mvc配置类,取代servlet.xml
@Override
protected Class<?>[] getServletConfigClasses()
{
return new Class<?>[] { WebMvcConfig.class };
}

// 配置拦截的请求类型,相当于web.xml中的<url-pattern>配置
@Override
protected String[] getServletMappings()
{
return new String[] { "/" };
}

// 配置文件上传参数,限制
@Override
protected void customizeRegistration(Dynamic registration)
{
// 上传路径
String uploadPath = "d:/upload/";
// 单个文件最大20mb
Long fileMax = (long) (20 * Math.pow(2, 20));
// 总上传文件最大200mb
Long totalMax = (long) (200 * Math.pow(2, 20));
registration.setMultipartConfig(new MultipartConfigElement(uploadPath, fileMax, totalMax, 0));
}

@Override
public void onStartup(ServletContext servletContext) throws ServletException
{
Filter filter = new CharacterEncodingFilter("utf-8", true);
servletContext.addFilter("encodingFilter", filter).addMappingForUrlPatterns(null, false, "/");
super.onStartup(servletContext);
}

}

控制器代码
package com.spring16.controller;

import java.io.File;
import java.io.IOException;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;

@Controller
@RequestMapping("/r")
public class RoleController
{

@RequestMapping(value = "/upload")
public ModelAndView upload(@RequestParam("uploadFile") MultipartFile file)
{
ModelAndView modelAndView = new ModelAndView();
modelAndView.setView(new MappingJackson2JsonView());
try
{
String fileName = file.getOriginalFilename();
File dest = new File(fileName);
file.transferTo(dest);
modelAndView.addObject("成功标识", true);
modelAndView.addObject("msg", "上传成功");
} catch (IllegalStateException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
return modelAndView;
}

}


请大佬们帮帮我,谢谢
...全文
541 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Little5 2020-03-21
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
multipart name entype 这两个参数看看
Little5 2020-03-16
  • 打赏
  • 举报
回复
引用 6 楼 玲玲。 的回复:
multipart name entype 这两个参数看看
应该没问题的。我用chrome上传就正常
Little5 2020-03-13
  • 打赏
  • 举报
回复
引用 4 楼 umbrellall1 的回复:
[quote=引用 3 楼 Little5 的回复:] [quote=引用 2 楼 umbrellall1 的回复:] 第一 是文件没找到 第二个 是上传类型不是multipart 用网络工具看一下上传的contentType 是不是multipart/form-data
你说的两个都不是问题哈。都是对的[/quote] 异常不撒谎[/quote]
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="./r/upload" method="post" enctype="multipart/form-data">
		<h1>
		<input type="file" name="uploadFile" value="请选择上传文件">
		<input type="submit" value="提交">
		</h1>
	</form>
</body>
</html>
这没问题的
umbrellall1 2020-03-13
  • 打赏
  • 举报
回复
引用 3 楼 Little5 的回复:
[quote=引用 2 楼 umbrellall1 的回复:] 第一 是文件没找到 第二个 是上传类型不是multipart 用网络工具看一下上传的contentType 是不是multipart/form-data
你说的两个都不是问题哈。都是对的[/quote] 异常不撒谎
Little5 2020-03-12
  • 打赏
  • 举报
回复
引用 2 楼 umbrellall1 的回复:
第一 是文件没找到 第二个 是上传类型不是multipart 用网络工具看一下上传的contentType 是不是multipart/form-data
你说的两个都不是问题哈。都是对的
umbrellall1 2020-03-12
  • 打赏
  • 举报
回复
第一 是文件没找到 第二个 是上传类型不是multipart 用网络工具看一下上传的contentType 是不是multipart/form-data
Little5 2020-03-09
  • 打赏
  • 举报
回复
自己顶一下

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧