Azure Blob PHP SDK - 直接从自定义多部分 API 请求上传到 Azure 存储

Posted

技术标签:

【中文标题】Azure Blob PHP SDK - 直接从自定义多部分 API 请求上传到 Azure 存储【英文标题】:Azure Blob PHP SDK - Upload directly from a custom multipart API request to Azure Storage 【发布时间】:2020-03-24 08:15:13 【问题描述】:

我正在使用 phpAzure\azure-storage-php 库将 blob 文件(在我的情况下为图像或视频)上传到 Azure Blob 存储。该文件使用多部分 API 调用从移动应用上传到服务器,然后服务器将其上传到 Blob 存储。

这个场景的问题是:

文件需要双倍的时间上传,因为它首先完全上传到服务器,然后从服务器上传到 Azure。 上传到服务器后,成功响应 (HTTP 200) 会返回到移动应用程序(来自我们的服务器 API)。但实际上该文件在 Azure 中尚不可用,可能需要一些时间才能准备好,具体取决于其大小。

我正在寻找一种将文件立即从多部分“流式传输”到天蓝色(作为传递)以防止这种“双重上传”情况的方法。

我不想为移动应用提供指向 blob 存储的直接链接以防止滥用,此外我需要执行额外的检查(例如 mimetype 检查),这就是我需要服务器的原因。

这可以实现吗?

作为参考,这是我正在使用的示例(我的代码基本相同):storage-blobs-php-quickstart/blob/master/phpQS.php。

【问题讨论】:

【参考方案1】:

听起来您构建了一个multipart/form 请求,以将带有 blob 文件的表单数据从您的移动应用程序发送到您的服务器,然后将该 blob 放入从您的服务器到 Azure Blob 存储的请求中。因此,在此过程中,实际上相同的 blob 内容从移动设备传输到您的服务器到 Azure 存储,这需要双倍上传 blob 的时间。

但是,如果你想直接将文件上传到 Azure 存储到你的服务器,使用multipart/form 请求是不可能的,你必须在multipart/form 中分离一个独立的文件请求来执行上传操作.

在这种情况下,要从移动应用程序中放置一个 blob,我认为您可以直接使用 Azure Storage SDK for androidios,即使是浏览器上的 JS (a sample for uploading blob from browser directly) 也可以在移动应用程序中使用 webkit 小部件上传文件。

如您所想,将 Azure 存储的帐户名称和密钥写入您的移动应用程序可能并不安全。但是您可以创建一个 API 用于生成带有 sas 令牌的 blob url 并在服务器上的 PHP 中写入权限,然后从移动设备调用它以获取上传 blob 的 url。

生成带有sas令牌和写权限的blob url的示例代码类似于官方示例代码中的函数generateBlobDownloadLinkWithSAS,只需将'r'更改为'cw'即可。

那么,一个简单的带有 sas url 的 PUT 请求就足以上传文件,正如 REST 文档部分 Example: Upload a Blob using a Container’s Shared Access Signature 所述,如下示例所示。

PUT https://myaccount.blob.core.windows.net/pictures/photo.jpg?sv=2015-02-21&st=2015-07-01T08%3a49Z&se=2015-07-02T08%3a49Z&  
sr=c&sp=w&si=YWJjZGVmZw%3d%3d&sig=Rcp6gQRfV7WDlURdVTqCa%2bqEArnfJxDgE%2bKH3TCChIs%3d HTTP/1.1  
Host: myaccount.blob.core.windows.net  

Content-Length: 12  

Hello World.  

【讨论】:

以上是关于Azure Blob PHP SDK - 直接从自定义多部分 API 请求上传到 Azure 存储的主要内容,如果未能解决你的问题,请参考以下文章

Azure PHP SDK:在单个 zip 文件中下载容器的所有 blob

Azure Storage Blob Go SDK示例

使用 Blob 服务客户端查找 azure 帐户密钥失败(azure python sdk)

未从 blob 上的 azure java sdk 收到元数据字段

使用 Azure Java SDK V12 和 ListBlobs() 在 Azure Blobstorage 中列出 Blob 非常慢

如何使用 .NET v12 SDK 在 Azure Blob 存储中上传具有指定 ContentType 的 Blob?