问题描述
所以我尝试制作一个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 应用程序,它会有所帮助。