Fine-Uploader 通过 python flask 深入了解 Azure Blob 存储的使用

Fine-Uploader in depth information on the use of Azure Blob Storage through python flask

我需要有关配置精细上传器以使用 Azure Blob 存储的过程的深入信息(代码示例将不胜感激)。

目前我在理解 fine-uploader 的控制流和整体行为方面遇到了问题。我已经查看了 fine-uploader 网站上的文档,但我需要在没有知识假设的情况下描述更多信息。

到目前为止,我的解决方案的架构如下:

我的解决方案由服务器 (SRV)、客户端 (CL) 和 azure blob 存储容器 (AC) 组成。我想要做的是使 CL 能够将 jpg 文件上传到 AC,为此我目前正处于为 CL 提供 blob 存储容器的 SAS 签名的阶段。

我目前无法这样做(我认为这可能无法正确实施)。来自fine-uploader的GET请求的处理程序如下:

@login_required
@app.route('/sas', methods=['GET'])
def sas():
    container_name = '/asilverman/picdepot/'
    sas = SharedAccessSignature(account_name=app.config['AZURE_ACCOUNT'],account_key=app.config['AZURE_KEY'])
    access_policy = AccessPolicy()
    access_policy.start =   '2015-08-22T21:00:00Z'   #(datetime.datetime.utcnow() + datetime.timedelta(seconds=-120)).strftime('%Y-%m-%d') #T%H:%M:%SZ
    access_policy.expiry =  '2015-08-25T21:00:00Z'   #(datetime.datetime.utcnow() + datetime.timedelta(seconds=120)).strftime('%Y-%m-%dT%H:%M:%SZ')
    access_policy.permission = 'w'
    sap = SharedAccessPolicy(access_policy)
    sas_token = sas.generate_signed_query_string(container_name, 'c', sap)
    return request.args['bloburi'] + '?' + sas_token   

我的主要 Blob 服务端点是:https://asilverman.blob.core.windows.net/

我希望存放图片文件的容器名称是:picdepot

我的精品上传器配置如下:

var uploader = new qq.azure.FineUploader({

        debug: true,
        element: document.getElementById("fine-uploader"),
        request: {
            endpoint: 'https://asilverman.blob.core.windows.net/picdepot'
        },
        cors: {
            //all requests are expected to be cross-domain requests
            expected: true,
            sendCredentials: true

        },
        signature: {
            customHeaders: {'Access-Control-Allow-Origin': true},
            endpoint: '/sas'
        },
        uploadSuccess: {
            endpoint: ''
        },
        scaling: {
            sendOriginal: false,

            sizes: [
                {name: "", maxSize: 800}
            ]
        },
        validation: {
            allowedExtensions: ['jpeg', 'jpg', 'png']
        }

    });

我的CORS配置如下:

    Storage Account: https://asilverman.blob.core.windows.net/
Cors.CorsRules.Count         : 1
corsRule[index]              : 0
corsRule.AllowedHeaders      : Content-Type
corsRule.AllowedHeaders      : Access-Control-Allow-Origin
corsRule.AllowedHeaders      : x-ms-*
corsRule.AllowedMethods      : Get, Put, Delete
corsRule.AllowedOrigins      : *
corsRule.ExposedHeaders      : Access-Control-Allow-Origin
corsRule.MaxAgeInSeconds     : 432000
DefaultServiceVersion        : 2013-08-15
HourMetrics.MetricsLevel     : None
HourMetrics.RetentionDays    :
HourMetrics.Version          : 1.0
Logging.LoggingOperations    : None
Logging.RetentionDays        :
Logging.Version              : 1.0
MinuteMetrics.MetricsLevel   : None
MinuteMetrics.RetentionDays  :
MinuteMetrics.Version        : 1.0
New Properties:    
Cors.CorsRules.Count         : 1
corsRule[index]              : 0
corsRule.AllowedHeaders      : *
corsRule.AllowedMethods      : Get, Put, Delete
corsRule.AllowedOrigins      : *
corsRule.ExposedHeaders      : *
corsRule.MaxAgeInSeconds     : 432000
DefaultServiceVersion        : 2013-08-15
HourMetrics.MetricsLevel     : None
HourMetrics.RetentionDays    :
HourMetrics.Version          : 1.0
Logging.LoggingOperations    : None
Logging.RetentionDays        :
Logging.Version              : 1.0
MinuteMetrics.MetricsLevel   : None
MinuteMetrics.RetentionDays  :
MinuteMetrics.Version        : 1.0

I was unable to do so currently ( I assume this could be not implemented correctly).

return request.args['bloburi'] + '?' + sas_token   

@asilveman,如果能提供这个实现的输出就更好了,据我了解,URL的标准格式是:

storage_url+container_name + '/' + blob_name+'?'+qry_string 

而qry_string这里是我们需要生成的共享访问签名url。

供您参考的代码片段

from azure.storage import AccessPolicy
 from azure.storage.sharedaccesssignature import (
 SharedAccessPolicy,
 SharedAccessSignature,
 )

 DEV_STORAGE_ACCOUNT_NAME ="xxxxx"
 DEV_STORAGE_ACCOUNT_KEY ="xxxxx"
 CONTAINER_NAME='xxxxx'
 STORAGE_URL = 'xxxxx'

 def generate_signature_blob(dev_storage_account_name,dev_storage_account_key,container_name):
 sas = SharedAccessSignature(account_name=dev_storage_account_name,account_key=dev_storage_account_key)
 accss_plcy = AccessPolicy()
 accss_plcy.expiry = '2016-10-12'
 accss_plcy.permission = 'w'
 sap = SharedAccessPolicy(accss_plcy)
 sasToken = sas.generate_signed_query_string(container_name,'container',sap)
 return sas._convert_query_string(sasToken).replace("container","c")

生成共享访问签名url:

qry_string = generate_signature_blob(DEV_STORAGE_ACCOUNT_NAME,DEV_STORAGE_ACCOUNT_KEY,CONTAINER_NAME)

在 Python 项目中,您可以利用 urllib2 发出这样的 PUT 请求 导入 urllib2

def put_blob(storage_url,container_name, blob_name,qry_string,x_ms_blob_type):
 opener = urllib2.build_opener(urllib2.HTTPHandler)
 request = urllib2.Request(storage_url+container_name + '/' + blob_name+'?'+qry_string, data='Hello World!!')
 request.add_header('x-ms-blob-type', x_ms_blob_type)
 request.get_method = lambda: 'PUT'
 opener.open(request)

然后通过调用将 blob 上传到 Azure 存储:

put_blob(STORAGE_URL,CONTAINER_NAME,"sample.jpg",qry_string,"BlockBlob")

您可能还想参考 Prashanth 创建的 good guidance,如果您有任何进一步的疑虑,请随时告诉我们。