我有一个带有端点的应用程序和一个与其一起运行的 tomcat 服务器。我可以使用文件到达邮递员上的端点,并将其上传到我的服务器上的 Excel 文件中。
问题是为了让它工作,我必须在我的tomcat的context.xml中添加allowCasualMultipartParsing =“true”,我不想在我的本地tomcat上添加此修复。
我需要一个修复程序,尽管它运行在 tomcat 服务器上,但它仍然可以工作。因此,如果有人添加一个新的 tomcat,他们就不会遇到这个问题。例如在 tomcat 9.0.6 上
很难演示这个问题,因为这是由于在独立的 tomcat 上运行应用程序造成的。当我在没有独立 tomcat 9.0.38 的情况下运行它时它可以工作。
上传文件代码
@Controller
@RequestMapping("/ListCtrl")
public class listController {
@RequestMapping(method = {RequestMethod.POST}, value = "/list")
@Consumes (MediaType.MULTIPART_FORM_DATA)
@Produces (MediaType.TEXT_XML)
@ResponseBody public Map<String, Object> uploadFile(
@FormDataParam("file") InputStream uploadedInputStream,
@FormDataParam("file") MultipartFile file,
@RequestParam("listName") String listName,
@RequestParam Integer
listid){
Map<String, Object> resultMap = null;
resultMap = new HashMap<>();
resultMap.put("status", "successful");
resultMap.put("file", file.getName());
System.out.println(file.getOriginalFilename());
return resultMap;
}
我在无法正常工作的项目中遇到的错误是 HTTP 状态 500 - 无法解析多部分 servlet 请求;嵌套异常是java. lang.IllegalStateException:无法处理部件,因为未提供多部件配置
我找到了解决方案。我以前见过它,但不完全理解,所以我想在这里详细说明,以防其他人看到它。尽管 Tomcat 正在运行,但该解决方案仍然有效。 您需要创建一个 META-INF 文件夹。对于我来说,我在部署的资源文件夹下创建并添加了 context.xml。将
allowCasualMultipartParsing="true"
放入 Context
标签后。
Web应用程序/部署的资源/META-INF/context.xml。
<Context allowCasualMultipartParsing="true"/>
提供配置就足够了。正如 Spring 文档中提到的,Spring 中包含两个具体实现。
maxUploadSize、maxInMemorySize 和 defaultEncoding 设置作为 bean 属性。但是,您必须将其导入为:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
在你的代码中:
@Configuration
public class WebConfig {
private int maxUploadSizeInMb = 2 * 1024 * 1024; // 2 MB
...
...
@Bean("multipartResolver")
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver cmr = new CommonsMultipartResolver();
cmr.setMaxUploadSize(maxUploadSizeInMb * 2); //sum size of all files/parts of a file. Since, a file may be partitioned
cmr.setMaxUploadSizePerFile(maxUploadSizeInMb);//maximum file size of each file
return cmr;
}
}