Python 是否有临时目录或直接方式在azure存储中上载文件?

Python 是否有临时目录或直接方式在azure存储中上载文件?,python,azure,file-upload,azure-storage,azure-storage-blobs,Python,Azure,File Upload,Azure Storage,Azure Storage Blobs,因此,我尝试制作一个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_cl

因此,我尝试制作一个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上,然后替换其本地路径,但是我不想让我的虚拟机满。

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

要生成URL,请按照以下代码进行操作:

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)
从datetime导入datetime,timedelta
从azure.storage.blob导入生成\u blob\u sas、blob任务
blobname=“”
accountkey=“#从azure存储中的访问密钥部分获取此信息。
containername=“”
def getpushurl(文件名):
令牌=生成\u blob\u sas(
账户名称=blobname,
容器名称=容器名称,
account\u key=accountkey,
权限=BlobSasPermissions(write=True),
expiry=datetime.utcnow()+timedelta(秒=100),
blob_name=文件名,
)
url=f“https://{blobname}.blob.core.windows.net/{containername}/{filename}?{token}”
返回url
pdfpushurl=getpushurl(“demo.text”)
打印(pdfpushurl)
因此,在生成此URL后,将其交给客户端,以便客户端可以直接将文件发送到通过PUT请求接收的URL,并将其直接上载到azure存储。

您可以为用户生成具有写入权限的文件,以便您的用户可以直接上载.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令牌后,请看这个,我认为如果您正在开发一个web应用程序,它将非常有用。

我假设您正在通过API中的某个前端接收文件,当您接收到它时,您首先将其保存到一个文件,然后将其上载。这是正确的吗?您可以为您的用户生成一个具有写入权限的SAS令牌,这样您的用户就可以直接上载.pdf文件,而无需存储在服务器上是的,前端会提供API文件,但我不想在收到文件后将其发送到azure storageHow?你的问题解决了吗?