HTTP 请求实现文件上传的问题,请教如何解决?

查看 84|回复 5
作者:lazyczx   
我想实现一个 Web 文件管理应用,刚刚用 SpringBoot 搭建了一个 Demo:
public class FileController {
    FileService fileService;
    @PostMapping("/upload")
    public ResponseEntity upload(@RequestParam("file") MultipartFile file) {
        if (fileService.trySave(file)) {
            return ResponseEntity.ok("File uploaded successfully");
        }
        return ResponseEntity.internalServerError().body("Failed to upload the file");
    }
}
( Service 的代码就不放了,因为对于问题来说不重要)
然后测试了一下接口,我把 url 打错了,然后上传了一个比较大的文件,结果请求了很久才返回 404 的 response 。
然后我又试了以下,并且在期间打开任务管理器,发现 jdk binary 的磁盘 IO 高起来了。。等了半天,大约是文件传完了(或者说 HTTP 请求体传完了)才返回 resp 。

然后我问 GPT 为什么会这样,它说因为我用 HTTP 请求传文件,服务端就是要接受了整个请求体(包含大文件)之后,才会处理 url 匹配之类的逻辑。我越想越离谱,这不是意味着我可以往接受大文件上传的域名一直发文件吗?然后每个被我请求的服务器都要进行磁盘 IO ,就因为这个 HTTP 协议的特性?
然后我问了 GPT 解决方法,它给出

  • 用客户端做可达性分析
    似乎脱离了讨论的范畴,因为我直接测的接口,想知道在这个前提下的解决办法是什么

  • 用中间件验证权限和 url
    中间件也是服务器,也需要接受 HTTP 请求,那不也浪费了资源吗?

  • 用分片上传
    似乎还是无法避免浪费资源

    好像这些办法都没用,因为大前提都是使用了 HTTP 请求,因此服务器必须要接受这个请求之后再处理。。因此我看不出这些方法解决这个问题的可行性。
    渴望有人指点下我的迷惑。
  • tool2d   
    和 gpt 说,用 ajax 来上传文件,可以控制上传进度。
    纯 http 上传相对来说,要复杂一点。
    githmb   
    不太可能额,我之前遇到这种情况是多了一层傻逼的防火墙
    服务器拿到请求第一行就能拿 URL 去做匹配了呀
    POST /upload HTTP/1.1
    Host: xxx
    wancaibida   
    用云存储服务, 从客户端直接传到云平台
    shuax   
    java 不懂,nginx 有 client_max_body_size ,应该类似吧
    tool2d   
    @githmb OP 贴出来的 SpringBoot API 回调不行,带有 MultipartFile file 参数,就必须等数据上传完成,才会触发回调函数。
    有你说的提前匹配,要用另外的 API 。
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部