Spring异步文件上传和处理

布吕格斯

我正在尝试上传文件,然后读取它,一切正常,但是当我@Async在处理程序方法上添加注释时,一切都没有问题

我不希望用户一直等待,直到它处理文件。但是,在放置此注释后,我得到了java.lang.IllegalStateException: File has been moved - cannot be read again例外。会发生什么,我该如何解决?据我了解,Spring可能只是清除文件,因为请求-响应结束并对其进行了清理。但是不应该@Async防止这种情况吗?

样例Spring Boot应用程序:

@SpringBootApplication
@EnableSwagger2
@ComponentScan(value = "hello")
@EnableAsync
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.regex("/api/.*"))
                .build();
    }
}

上载控制器:

@RestController
@RequestMapping(value = "/files")
public class FilesController {

    @Inject
    private Upload upload;

    @RequestMapping(method = RequestMethod.POST)
    public void addSource(@RequestParam MultipartFile file) throws IOException, InterruptedException {
        upload.process(file);
    }
}

上载服务:

@Component
public class Upload {

    @Async
    public void process(MultipartFile file) throws InterruptedException, IOException {
        sleep(2000);
        System.out.println(new String(IOUtils.readFully(file.getInputStream(), -1, false)));
    }
}

现在我明白了java.io.FileNotFoundException我不确定我在这里缺少什么。可能是我做错了,因为我找不到任何错误,所以我认为这是非常常见的用例。

您不能@Async以这种方式将MultipartFile参数传递给您的方法。

addSource方法结束时,MultipartFile超出范围并释放资源。因此,“过程”方法内部的访问将失败。您可以通过这种方式建立某种竞争条件。SpringsDispatcherServlet用于StandardServletMultipartResolver.cleanupMultipart清理那些文件。在该处放置一个断点,以查看何时重新调用该方法addSource(...)

您应该执行以下操作:将整个文件读入addSource方法内部的Buffer中然后将缓冲区传递给processMethod并让其addSource返回。

您所说的“ ...正在处理文件...”不是在“处理”文件,而是在读取文件。

@Async
public void process(byte[] bs){
    System.out.println(new String(bs));
    //do some long running processing of bs here
}

@RequestMapping(method = RequestMethod.POST)
public void addSource(@RequestParam MultipartFile file) {
    upload.process(IOUtils.toByteArray(file));
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

上传和处理文件进度

来自分类Dev

上传和处理文件进度

来自分类Dev

Spring Boot在Undertow / Wildfly上的文件上传和可接受的错误处理

来自分类Dev

如何使用ajax文件上传和spring mvc上传文件?

来自分类Dev

使用Spring MVC和MockMVC上传文件

来自分类Dev

使用angularjs和spring boot上传文件

来自分类Dev

如何使用Spring Security很好地处理文件上传MaxUploadSizeExceededException

来自分类Dev

如何使用Spring Security很好地处理文件上传MaxUploadSizeExceededException

来自分类Dev

承诺的角度异步上传文件

来自分类Dev

Django上传和处理文件,不保留数据

来自分类Dev

使用ftplib和多重处理上传多个文件

来自分类Dev

使用Bottle上传和处理CSV文件;可能的编码问题

来自分类Dev

如何处理和删除“被遗忘”的上传文件?

来自分类Dev

在表单提交时处理文件解析和上传

来自分类Dev

Angular JS + Spring 4:上传文件和表单数据

来自分类Dev

使用Spring Boot和Thymeleaf上传多个文件

来自分类Dev

使用 ajax 和 spring mvc、jsp 上传文件和数据

来自分类Dev

通过表单和 XMLHttpRequest 异步上传文件到服务器

来自分类Dev

Ajax上传Spring文件

来自分类Dev

Angular Spring文件上传

来自分类Dev

文件上传 Java Spring

来自分类Dev

spring如何上传文件?

来自分类Dev

IFileRepositoryProvider处理上传的文件

来自分类Dev

使用go处理文件上传

来自分类Dev

处理MaxUploadSizeExceededException:Ajax文件上传

来自分类Dev

“同步”处理多个上传的文件

来自分类Dev

Django上传的文件无法处理

来自分类Dev

使用jQuery异步上传文件的操作

来自分类Dev

使用jQuery异步上传文件的操作

Related 相关文章

热门标签

归档