首页 > 解决方案 > 在 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 中,我该怎么做?

标签: symfonysymfony-2.8nsurlsessionuploadtask

解决方案


这超出了 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


推荐阅读