Saya melakukan tugas sederhana mengunggah file menggunakan pustaka permintaan Python. Saya mencari Stack Overflow dan sepertinya tidak ada yang memiliki masalah yang sama, yaitu file tidak diterima oleh server:
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)
Saya mengisi nilai kata kunci 'upload_file' dengan nama file saya, karena jika saya biarkan kosong, katanya
Error - You must select a file to upload!
Dan sekarang saya mengerti
File file.txt of size bytes is uploaded successfully!
Query service results: There were 0 lines.
Yang muncul hanya jika file tersebut kosong. Jadi saya terjebak bagaimana mengirim file saya dengan sukses. Saya tahu bahwa file tersebut berfungsi karena jika saya membuka situs web ini dan mengisi formulir secara manual, ia mengembalikan daftar objek yang cocok, yang saya cari. Saya sangat menghargai semua petunjuk.
Beberapa utas lain terkait (tetapi tidak menjawab masalah saya):
sumber
files = [('attachment', open('attachment1.txt', 'rb')), ('attachment', open('attachment2.txt', 'rb'))]
. Setiap tupel adalah sepasang kunci dan nilai.files={'file':('nameoffile',open('namoffile','rb'),'Content-Type':'text/html','other header'),'file2':('nameoffile2',open('nameoffile2','rb'),'Content-Type':'application/xml','other header')}
tetapi Jika file = {} digunakan maka headers = {'Content-Type': 'blah blah'} tidak boleh digunakan! -> @ martijn-pieters: karena multipart / form-data Content-Type harus menyertakan nilai batas yang digunakan untuk menggambarkan bagian-bagian dalam badan posting. Tidak menyetel header Jenis Konten memastikan bahwa permintaan menyetelnya ke nilai yang benar.requests
tutup itu?with open(...) as fobj:
dan gunakanfobj
dalamfiles
pemetaan.(2018) pustaka permintaan python baru telah menyederhanakan proses ini, kita dapat menggunakan variabel 'file' untuk memberi sinyal bahwa kita ingin mengunggah file yang dikodekan multipart
sumber
lsof
, tampaknya file tetap terbuka, atau setidaknya, begitulah cara saya menafsirkan hasil berikut. Sebelumnya, menjalankanopen
tidak ada record dalamlsof
tabel tentangfilename
. Kemudian setelahopen
dijalankan, beberapa record muncul denganread
akses. Setelah menjalankanrequests.post
, catatan masih ada yang menunjukkan bahwa file tersebut tidak ditutup.Unggahan Klien
Jika Anda ingin mengunggah satu file dengan
requests
pustaka Python , maka permintaan lib mendukung unggahan streaming , yang memungkinkan Anda mengirim file atau streaming besar tanpa membaca ke dalam memori .Sisi server
Kemudian simpan file di
server.py
samping sedemikian rupa sehingga menyimpan aliran ke dalam file tanpa memuat ke memori. Berikut adalah contoh penggunaan upload file Flask .Atau gunakan Penguraian Data Formulir werkzeug seperti yang disebutkan dalam perbaikan untuk masalah " unggahan file besar memakan memori " untuk menghindari penggunaan memori secara tidak efisien pada unggahan file besar (st 22 GiB file dalam ~ 60 detik. Penggunaan memori konstan sekitar 13 MiB.).
sumber
Di Ubuntu Anda dapat menerapkan cara ini,
untuk menyimpan file di beberapa lokasi (sementara) dan kemudian membuka dan mengirimkannya ke API
sumber
data
variabel?