微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否有临时目录或直接方法可以在 azure 存储中上传文件?

如何解决是否有临时目录或直接方法可以在 azure 存储中上传文件?

所以我尝试制作一个python API,以便用户可以上传pdf文件,然后API将其直接发送到Azure存储。我发现我必须有一个目录,即

container_client = ContainerClient.from_connection_string(conn_str=conn_str,container_name='mycontainer')
with open('mylocalpath/myfile.pdf',"rb") as data:
 container_client.upload_blob(name='myblockblob.pdf',data=data)

一个解决方案是我必须将它存储在 VM 上,然后替换它的本地路径,但我不想让我的 VM 满。

解决方法

如果您想直接从客户端将其上传到 azure 存储 blob,而不是将该文件接收到您的 API,您可以在您的存储帐户中使用 azure shared access signature 并从您的 API 中创建一个函数使用该 shared access signature 服务生成预签名 URL 并将该 URL 返回给您的客户端,这将允许客户端通过该 URL 将文件上传到您的 blob。

要生成网址,您可以按照以下代码进行操作:

from datetime import datetime,timedelta
from azure.storage.blob import generate_blob_sas,BlobSasPermissions

blobname= "<blobname>"
accountkey="<accountkey>" #get this from access key section in azure storage.
containername = "<containername>"


def getpushurl(filename):
    token = generate_blob_sas(
        account_name=blobname,container_name=containername,account_key=accountkey,permission=BlobSasPermissions(write=True),expiry=datetime.utcnow() + timedelta(seconds=100),blob_name=filename,)
    url = f"https://{blobname}.blob.core.windows.net/{containername}/{filename}?{token}"
    return url


pdfpushurl = getpushurl("demo.text")
print(pdfpushurl)

因此在生成此 URL 后将其提供给客户端,以便客户端可以将文件直接发送到通过 PUT 请求接收到的 URL,并将其直接上传到 azure 存储。

,

您可以为您的用户生成具有写入权限的 SAS token,以便您的用户可以直接上传 .pdf 文件,而无需将它们存储在服务器上。详情请看我之前的帖子。

尝试使用以下代码生成具有容器写入权限的 SAS 令牌:

from azure.storage.blob import BlobServiceClient,ContainerSasPermissions,generate_container_sas
from datetime import datetime,timedelta


storage_connection_string=''
container_name = ''

block_blob_service = BlobServiceClient.from_connection_string(storage_connection_string)
container_client = block_blob_service.get_container_client(container_name)


sasToken = generate_container_sas(account_name=container_client.account_name,container_name=container_client.container_name,account_key= container_client.credential.account_key,#grant write  permission only
                        permission=ContainerSasPermissions(write=True),start=datetime.utcnow() - timedelta(minutes=1),#1 hour vaild time 
                        expiry=datetime.utcnow() + timedelta(hours=1)
                        )

print(sasToken)

在您向用户回复此 SAS 令牌后,只需查看此 official guide to upload files from a HTML page,我认为如果您正在开发 Web 应用程序,它会有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。