我在迁移的过程中提供大型下载文件的网站(4GB及以上)到Azure。我已经成功创建了到Azure存储帐户的连接,因此我可以检索文件。但是下载a)需要很长时间才能启动,b)消耗内存负载,因为我在实际将可下载数据发送到客户端之前将整个文件读入内存。有没有一种方法可以从Storage帐户分块读取文件,以避免延迟和内存消耗?当前代码如下所示:
$getBlobResult = $blobClient->getBlob($containerName,$FileName);
$blobProperties=($getBlobResult->getProperties());
$FileSize=$blobProperties->getContentLength();
// Send headers
header ("Content-type: application/octet-stream");
header ("Content-Length: $FileSize");
header ("Content-Disposition: attachment; filename=\"$FileName\"");
// Send content of file
echo stream_get_contents($getBlobResult->getContentStream());
3条答案
按热度按时间ljsrvy3e1#
出于许多原因,我建议直接从存储中下载,主要是因为你有很大的I/O性能影响,而且你的流量也很大。
除了使用PHP,我建议使用以下解决方案-这取决于您的托管环境允许您做什么。
azcopy
的东西把文件下载到你的服务器上,把它重命名为一些<hash>.<ext>
,然后把直接的URL提供给用户。gmol16392#
是否有方法从存储帐户中分块读取文件,以避免延迟和内存消耗?
你当然可以这样做。当使用
getBlob
方法下载blob时,你需要在options
参数中指定你想要下载的字节范围,该参数的类型为GetBlobOptions
。如果我没有弄错的话,你需要定义
start-end
的范围(例如0-1023
下载1KB)vlju58qv3#
正如@CodeBrauer建议的那样,通过签名的URL将文件提供给用户是最可取的解决方案,因为您根本不必通过代码/基础设施来传输数据。
如果这与您的要求不一致,那么您可以尝试替换:
其中:
它应该直接转储流而不需要任何缓冲区。
https://www.php.net/manual/en/function.fpassthru