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 【问题描述】:我正在使用 php 的 Azure\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 android 或 ios,即使是浏览器上的 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
使用 Blob 服务客户端查找 azure 帐户密钥失败(azure python sdk)
未从 blob 上的 azure java sdk 收到元数据字段
使用 Azure Java SDK V12 和 ListBlobs() 在 Azure Blobstorage 中列出 Blob 非常慢
如何使用 .NET v12 SDK 在 Azure Blob 存储中上传具有指定 ContentType 的 Blob?