Я выполняю простую задачу по загрузке файла с помощью библиотеки запросов Python. Я искал переполнение стека, и, похоже, ни у кого не было такой же проблемы, а именно, что файл не получен сервером:
import requests
url='http://nesssi.cacr.caltech.edu/cgi-bin/getmulticonedb_release2.cgi/post'
files={'files': open('file.txt','rb')}
values={'upload_file' : 'file.txt' , 'DB':'photcat' , 'OUT':'csv' , 'SHORT':'short'}
r=requests.post(url,files=files,data=values)
Я заполняю значение ключевого слова 'upload_file' своим именем файла, потому что, если я оставлю его пустым, появится сообщение
Error - You must select a file to upload!
И теперь я получаю
File file.txt of size bytes is uploaded successfully!
Query service results: There were 0 lines.
Что появляется, только если файл пуст. Итак, я застрял в том, как успешно отправить мой файл. Я знаю, что файл работает, потому что если я перейду на этот веб-сайт и вручную заполню форму, он вернет хороший список совпадающих объектов, что мне и нужно. Буду очень признателен за все подсказки.
Некоторые другие темы, связанные (но не отвечающие на мою проблему):
источник
files = [('attachment', open('attachment1.txt', 'rb')), ('attachment', open('attachment2.txt', 'rb'))]
. Каждый кортеж - это пара ключ и значение.files={'file':('nameoffile',open('namoffile','rb'),'Content-Type':'text/html','other header'),'file2':('nameoffile2',open('nameoffile2','rb'),'Content-Type':'application/xml','other header')}
но если используется files = {}, то использовать headers = {'Content-Type': 'blah blah'} нельзя! -> @ martijn-pieters: так как Content-Type multipart / form-data должен включать граничное значение, используемое для разделения частей в теле сообщения. Отсутствие установки заголовка Content-Type гарантирует, что запросы установят для него правильное значение.requests
это?with open(...) as fobj:
и используйтеfobj
вfiles
сопоставлении.(2018) новая библиотека запросов python упростила этот процесс, мы можем использовать переменную files, чтобы сигнализировать, что мы хотим загрузить файл с кодировкой нескольких частей.
источник
lsof
кажется, что файл остается открытым, или, по крайней мере, так я интерпретирую следующие результаты. Раньше при запускеopen
вlsof
таблице не было записи оfilename
. Затем послеopen
выполнения появляется несколько записей сread
доступом. После выполненияrequests.post
записи все еще существуют, указывая, что файл не был закрыт.Загрузка клиента
Если вы хотите загрузить один файл с
requests
библиотекой Python , запросы lib поддерживают потоковую загрузку , что позволяет отправлять большие файлы или потоки без чтения в память .На стороне сервера
Затем сохраните файл
server.py
сбоку, чтобы сохранить поток в файл без загрузки в память. Ниже приведен пример использования загрузки файлов Flask .Или используйте werkzeug Form Data Parsing, как упоминалось в исправлении проблемы « загрузка больших файлов потребляет память », чтобы избежать неэффективного использования памяти при загрузке больших файлов (файл размером 22 ГБ за ~ 60 секунд. Использование памяти постоянно примерно на уровне 13 МиБ.).
источник
В Ubuntu вы можете применить этот способ,
чтобы сохранить файл в каком-либо месте (временно), а затем открыть и отправить его в API
источник
data
переменной?