[英]How to get "content_type" using Get File Properties REST API for Azure Files Storage using Python
[英]How to use Get File Properties REST API for Azure Files Storage using Python
我正在嘗試創建一個 Python 腳本,該腳本將利用適用於 Azure 的 Python SDK 和 REST API 來提取我的 Azure 文件存儲帳戶中文件的信息。
我正在使用 SDK 訪問存儲中的文件並獲取名稱。 然后使用我希望能夠調用 REST API 來獲取文件屬性的名稱,特別是 Last-Modified 屬性。 我嘗試使用 SDK 訪問最后修改的屬性,但由於某種原因它總是返回 None 。
我想使用上次修改日期來確定它是否已經超過 24 小時,如果已經超過,那么我想刪除該文件。 我不確定當我第一次創建文件並將其上傳到 azure 時,是否可以在文件的某個時間段屬性后設置某種自動刪除。 如果有,那么無論如何這將解決我的問題。
我已經在下面發布了我正在使用的代碼。 當我嘗試發出 HTTP 請求時,我收到錯誤消息“服務器無法對請求進行身份驗證。確保授權標頭的值形成正確,包括簽名。”
import datetime
import requests
import json
import base64
import hmac
import hashlib
import urllib
from azure.storage.file import *
StorageAccountConnectionString = ""
fileshareName = "testFileShare"
storage_account_name = "testStorage"
storage_account_key = ""
api_version = "2018-03-28"
file_service = FileService(connection_string=StorageAccountConnectionString)
listOfStateDirectories = file_service.list_directories_and_files(fileshareName)
for state_directory in listOfStateDirectories:
print("Cleaning up State Directory: " + state_directory.name)
if(isinstance(state_directory, Directory)):
listOfBridgeDirectories = file_service.list_directories_and_files(fileshareName, state_directory.name)
for bridge_directory in listOfBridgeDirectories:
if(isinstance(bridge_directory, Directory)):
print("Cleaning up Bridge Directory: " + bridge_directory.name)
path_to_bridge_directory = state_directory.name + "/" + bridge_directory.name
listOfFilesAndFolders = file_service.list_directories_and_files(fileshareName, path_to_bridge_directory)
for file_or_folder in listOfFilesAndFolders:
if isinstance(file_or_folder, File):
name_of_file = file_or_folder.name
# Get the time of the current request
request_time = datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')
string_to_append_to_url = fileshareName + '/' + path_to_bridge_directory + '/' + name_of_file
# Parse the url to make sure everything is good
# string_to_append_to_url = urllib.parse.quote(string_to_append_to_url)
string_params = {
'verb': 'HEAD',
'Content-Encoding': '',
'Content-Language': '',
'Content-Length': '',
'Content-MD5': '',
'Content-Type': '',
'Date': '',
'If-Modified-Since': '',
'If-Match': '',
'If-None-Match': '',
'If-Unmodified-Since': '',
'Range': '',
'CanonicalizedHeaders': 'x-ms-date:' + request_time + '\nx-ms-version:' + api_version + '\n',
'CanonicalizedResource': '/' + storage_account_name + '/' + string_to_append_to_url
}
string_to_sign = (string_params['verb'] + '\n'
+ string_params['Content-Encoding'] + '\n'
+ string_params['Content-Language'] + '\n'
+ string_params['Content-Length'] + '\n'
+ string_params['Content-MD5'] + '\n'
+ string_params['Content-Type'] + '\n'
+ string_params['Date'] + '\n'
+ string_params['If-Modified-Since'] + '\n'
+ string_params['If-Match'] + '\n'
+ string_params['If-None-Match'] + '\n'
+ string_params['If-Unmodified-Since'] + '\n'
+ string_params['Range'] + '\n'
+ string_params['CanonicalizedHeaders']
+ string_params['CanonicalizedResource'])
signed_string = base64.b64encode(hmac.new(base64.b64decode(storage_account_key), msg=string_to_sign.encode('utf-8'), digestmod=hashlib.sha256).digest()).decode()
headers = {
'x-ms-date': request_time,
'x-ms-version': api_version,
'Authorization': ('SharedKey ' + storage_account_name + ':' + signed_string)
}
url = ('https://' + storage_account_name + '.file.core.windows.net/' + string_to_append_to_url)
print(url)
r = requests.get(url, headers=headers)
print(r.content)
注意:有些目錄會有空格,所以我不確定這是否會影響 REST API 調用,因為 URL 也會有空格。 如果它確實影響它,那么我將如何訪問那些 URL 將包含空格的文件
我嘗試使用 SDK 訪問最后修改的屬性,但由於某種原因它總是返回 None 。
並非所有 SDK API 和 REST API 都會在響應的標頭中返回Last-Modified
屬性,其中包括 REST API List Directories and Files
以及 Python SDK API list_directories_and_files
。
我嘗試使用 SDK 重現您的問題,如下面的代碼。
generator = file_service.list_directories_and_files(share_name, directory_name)
for file_or_dir in generator:
if isinstance(file_or_dir, File):
print(file_or_dir.name, file_or_dir.properties.last_modified)
由於list_directories_and_files
方法不會返回File
對象中的任何屬性,所以上面代碼的file_or_dir.properties.last_modified
值為None
。
REST APIs Get File
, Get File Properties
, Get File Metadata
和 Python SDK APIs get_file_properties
, get_file_metadata
將在響應的標頭中返回Last-Modified
屬性,因此更改如下代碼以獲取last_modified
屬性以使其工作.
generator = file_service.list_directories_and_files(share_name, directory_name)
for file_or_dir in generator:
if isinstance(file_or_dir, File):
file_name = file_or_dir.name
file = file_service.get_file_properties(share_name, directory_name, file_name, timeout=None, snapshot=None)
print(file_or_dir.name, file.properties.last_modified)
當然,調用REST API和使用SDK API是一樣的。 但是,構建SAS簽名字符串容易出錯,對代碼閱讀不友好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.