symfony - 在 symfony 2.8 中使用 uploadtask 上传文件 api
问题描述
我们意识到,如果我们想要生成一个包含 15GB 视频文件的多部分查询,那么在内存中分配如此大量数据所需的大小是不可能的,大多数设备只有 2 或 3GB 的 RAM。
因此,绝对有必要切换到uploadTask 方法,该方法将向服务器推送IP 数据包允许的最大大小的块文件的内容到服务器。
这是一个 POST 方法。但是,它不包含文件夹 id 或文件名等参数。所以你需要一种方法来传输这些参数。最好的方法是在 URL 中对它们进行编码。
我提出了 API 端点后面的路径形式的编码格式,但我们也可以很好地在 URL 中以经典方式对这两个参数进行编码,例如:
/api/upload?id=123&filename=video.mp4
根据我在 Stackoverflow 上阅读的内容,使用 Symfony 检索 id 和文件名很简单。然后可以将在 POST 请求正文中接收到的所有数据以原始方式直接写入文件,而无需通过服务器端内存中的缓冲区。
用户数据必须流式传输,无论是移动端还是服务器端,无论是上传还是下载。在安全性方面,将用户内容加载到内存中也是非常危险的。
在 symfony 中,我该怎么做?
解决方案
这超出了 Symfony 的范围,并且取决于您使用的 Web 服务器。
默认情况下,使用 apache/nginx 和 php,您将收到一个已经缓冲的请求,因此您无法将其流式传输到文件中。
但是,有一些解决方案,例如使用 Apache,您可以流式传输请求,请参阅http://hc.apache.org/httpclient-3.x/performance.html#Request_Response_entity_streaming
可能 nginx 也有它的选项,但我不知道这些。
另一种选择可能是 websockets,请参阅http://en.wikipedia.org/wiki/WebSocket
推荐阅读
- docker - Docker 容器没有互联网:网络主机或 ISP 问题
- docker - 如何在 Docker 文件中配置 Databricks 令牌
- java - 从另一个线程扩展类更新 UI
- openstack - 实时迁移失败:并非所有参数都转换为字符串
- python - rnorm 与 numpy.random.normal 的功能
- javascript - querySelectorAll 不适用于类,但普通的 querySelector 就可以了
- json - 从 API Swift 特殊类型问题解码 JSON 文件
- c++ - 如何使用 lambda 捕获可变参数并将它们传递给内部范围
- ruby-on-rails - Rails 5 升级 - 控制器测试失败
- r - 运行 Motif 分析时 RStudio 出现“致命错误” - 需要故障排除建议