gpt4 book ai didi

java - Spring异步文件上传

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:22:46 26 4
gpt4 key购买 nike

这就是我正在做的。我想通过 Ajax 将多部分文件上传到我的 Spring Web 应用程序。当服务器收到 POST 请求时,它会在数据库中创建一个票号。然后它启动一个线程来处理实际的文件上传。服务器然后返回票号。

我正在使用 CommonsMultipartResolver 来处理请求,并且我已将 resolveLazily 标志设置为 true,以便不会立即解析 Multipart。

所以这是我所拥有的一些东西

@Controller
public class myController{

@RequestMapping(value = "/upload", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
@ResponseBody
public String upload(MultipartHttpServletRequest request, String fileName){

String ticket = dao.createUploadTicket(fileName);
Runnable run = new Runnable(){

@Override
public void run(){

dao.writeUpdate(ticket, "Getting data from request");
final MultipartFile file = request.getFile("theFile");
dao.writeUpdate(ticket, "Multipart file processed");
try {
dao.writeUpdate(ticket, "Saving file to disk");
file.transferTo(new File("/myDirectory"));
dao.writeUpdate(ticket, "File saved to disk");
}
catch(Exception e){
dao.writeUpdate(ticket, "File upload failed with the exception " + e.toString());
}
}
};
Thread t = new Thread(run);
t.start();
return ticket;
}
}

所以这里的重点是票号可以用来获取进度更新。假设正在上传一个大文件。使文件上传 POST(在本例中为 Ajax 请求)的客户端可以异步执行并取回票号。客户端可以使用该票号来确定文件上传的阶段并在另一个页面中显示信息。

另一个用途是,我可以拥有一个 HTML 页面,该页面向服务器请求所有票号,然后显示服务器上发生的所有文件上传的“实时” View 。

我无法让它工作,因为一旦 Controller 返回,Spring 就会在 CommonsMultipartResolver 中调用 cleanupMultipart()。由于 resolveLazily 标志设置为 false,当调用 cleanupMultipart() 时,它将开始解析和初始化多部分文件。这会导致调用“request.getFile("theFile");”之间的竞争条件。在 runnable 和 cleanupMultipart() 调用中最终导致异常。

有人有什么想法吗?我想进行后端异步文件处理,是否违反了某种 HTTP 协议(protocol)。

最佳答案

HTTP 请求已经在它自己的线程中执行,客户端可以并行、异步地发出很少的请求。所以你不需要开始一个新的线程。只需像往常一样在主线程中保存/处理文件。只在客户端进行“异步文件上传”。

此外,您应该仅在处理完输入后才发送 http 响应。我的意思是您无法读取输入 header 、进行 http 响应并继续从浏览器读取数据。使用输入 -> 处理它 -> 发送输出,这就是 HTTP 1/1.1 协议(protocol)的工作原理。

如果您需要发送票号进行上传,您可以在实际上传之前创建它,方法是使用两步上传,例如:

  • Ajax GET 请求获取票号
  • POST 文件内容和票号(从上一步收到)
  • + ajax GET 获取工单的当前状态,任何时候,异步

关于java - Spring异步文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10660961/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com