- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这就是我正在做的。我想通过 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)的工作原理。
如果您需要发送票号进行上传,您可以在实际上传之前创建它,方法是使用两步上传,例如:
关于java - Spring异步文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10660961/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!