Загрузка файла запроса на исправление - PullRequest
0 голосов
/ 05 марта 2019

У меня есть REST API, в который я пытаюсь загрузить данные, в основном это: https://docs.microsoft.com/en-us/rest/api/storageservices/datalakestoragegen2/path/update

Теперь, так как единственная опция, которую я имею, это PATCH, какие у меня есть варианты оптимизированной загрузки данных. Я был в состоянии загрузить файлы, используя параметр данных и функцию read (), но я не думаю, что это оптимально, поскольку весь файл считывается в память, я думаю. Я попытался использовать параметр files (кодирование формы multipaprt), а также посмотрел на пакет toolbelt, но, похоже, он не работает для PATCH

Это пример кода, который работает, но не является оптимальным

files={'file':('Sample',open('D:/FilePath/Demo.txt','rb'))}
length=os.stat('D:/FilePath/Demo.txt')
filesize=str(length.st_size)

with open('D:/File|Path/Demo.txt','rb') as f:
    file_data = f.read()

leng=len(file_data)

header = {
'Authorization': "Bearer " + auth_t
}

header_append = {
'Content-Length': filesize,
'Authorization': "Bearer " + auth_t
#'If-None-Match': "*" #Conditional HTTP Header
}

header_flush = {
'Content-Length': '0',
'Authorization': "Bearer " + auth_t
}


header_read = {
'Authorization': "Bearer " + auth_t
}

try:
    init_put=requests.put('https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?resource=file&recursive=True', headers=header_flush, proxies=proxies,verify=False)
    init_write=requests.patch('https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?action=append&position=0', headers=header_append, proxies=proxies,verify=False,data=file_data)

    flush_url='https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?action=flush&position=' + str(leng)
    init_flush=requests.patch(flush_url, headers=header_flush, proxies=proxies,verify=False)

Проблема в линии

init_write=requests.patch('https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?action=append&position=0', headers=header_append, proxies=proxies,verify=False,data=file_data)

Это, кажется, принимает только параметр данных. Если я изменю это на

init_write=requests.patch('https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?action=append&position=0', headers=header_append, proxies=proxies,verify=False,file=files)

Я получаю пустой файл.

То же самое имеет место, когда я использую пакет requestToolbelt.

Патч не распознает параметр файла? Ничто в документах с запросами не говорит об этом.

Кроме того, если параметр данных является единственным выходом, каков наилучший способ загрузки файла без выполнения функции f.read () или итеративного указания количества символов для чтения с использованием f.read (n). Разве нет лучшего способа?

1 Ответ

0 голосов
/ 07 марта 2019

После просмотра также почтальон, смог найти проблему.Вот решение.Проблема заключалась в операторе with open и, в частности, в параметре position для очищенной части, поскольку длина содержимого автоматически переопределялась, поэтому пришлось получать длину содержимого из запроса ответа.

files={'file':('Sample',open('D:/FilePath/Demo.txt','rb'))}
length=os.stat('D:/FilePath/Demo.txt')
filesize=str(length.st_size)
header = {
# 'Content-Type': 'text/plain',
'Authorization': "Bearer " + auth_t
#'If-None-Match': "*" #Conditional HTTP Header
}

header_append = {
'Content-Length': filesize,
'Authorization': "Bearer " + auth_t
#'If-None-Match': "*" #Conditional HTTP Header
}

header_flush = {
'Content-Type': "application/x-www-form-urlencoded",
'Content-Length': '0',
'Authorization': "Bearer " + auth_t,
#'If-None-Match': "*" #Conditional HTTP Header
}


header_read = {
# 'Content-Type': 'text/plain',
'Authorization': "Bearer " + auth_t,
#'Range': 'bytes=300000-302591'
#'If-None-Match': "*" #Conditional HTTP Header
}

try:
   init_put=requests.put('https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?resource=file&recursive=True', headers=header_flush, proxies=proxies,verify=False)
   init_write=requests.patch('https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?action=append&position=0', headers=header_append, proxies=proxies,verify=False,files=files)
   flush_length=init_write.request.headers['Content-Length']
   flush_url='https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?action=flush&position=' + str(flush_length)
   init_flush=requests.patch(flush_url, headers=header_flush, proxies=proxies,verify=False) 
except Exception as e:
    print("In Error")
    print(e)
...