Tomcat 和解析 MultipartFile 上传服务的问题
Issue with Tomcat and parsing MultipartFile Upload service
我有一个带有端点和 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: 由于未提供多部分配置,无法处理部分
你给个配置就够了。正如 spring 文档中提到的那样,Spring.
中包含两个具体实现
- CommonsMultipartResolver 用于 Apache Commons FileUpload 和
- StandardServletMultipartResolver 对于 Servlet 3.0+ 部分 API
为了更好的灵活性和可配置性,我选择使用 CommonsMultipartResolver。在这些优点中,它提供了 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;
}
}
我找到了解决方案。我以前看过但没有完全理解所以我想在这里详细说明以防其他人看到它。尽管 tomcat 开启了 运行,此解决方案仍然有效。
您需要创建一个 META-INF 文件夹。对我来说,我在部署的资源文件夹下创建了一个 context.xml。在我将 allowCasualMultipartParsing="true" 放入上下文标记之后。
Webapp/Deployed Resources/META-INF/context.xml.
我有一个带有端点和 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: 由于未提供多部分配置,无法处理部分
你给个配置就够了。正如 spring 文档中提到的那样,Spring.
中包含两个具体实现- CommonsMultipartResolver 用于 Apache Commons FileUpload 和
- StandardServletMultipartResolver 对于 Servlet 3.0+ 部分 API
为了更好的灵活性和可配置性,我选择使用 CommonsMultipartResolver。在这些优点中,它提供了 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;
}
}
我找到了解决方案。我以前看过但没有完全理解所以我想在这里详细说明以防其他人看到它。尽管 tomcat 开启了 运行,此解决方案仍然有效。 您需要创建一个 META-INF 文件夹。对我来说,我在部署的资源文件夹下创建了一个 context.xml。在我将 allowCasualMultipartParsing="true" 放入上下文标记之后。 Webapp/Deployed Resources/META-INF/context.xml.