Zenodo: Gagal mengunggah file yang lebih besar melalui API ke kotak pasir

Dibuat pada 26 Sep 2016  ·  6Komentar  ·  Sumber: zenodo/zenodo

Halo,

ketika saya mencoba mengunggah file uji> 100 MB melalui permintaan python dan Zenodo API (kotak pasir) menggunakan kode berikut

data = {'filename': 'test.zip'}
files = {'file': open(filename, 'rb')}
r = requests.post("https://sandbox.zenodo.org/api/deposit/depositions/%s/files?access_token=TOKEN" % deposition_id, data=data, files=files)

ia mengembalikan kode kesalahan http 413 ("413 Permintaan Entitas Terlalu Besar" yang btw tidak didokumentasikan dalam Dokumentasi API zenodo).

Kode yang sama diuji dengan file < 100 MB berfungsi dan mengembalikan 201 .

Apakah saya telah mencapai batas ukuran file? (jika demikian, akan lebih baik untuk menambahkan ini ke dokumentasi). Atau mungkin ini karena paket "permintaan" - apakah saya harus memasukkan data multipart?

Enhancement

Komentar yang paling membantu

Untuk berjaga-jaga jika ada yang menemukan ini, inilah beberapa Python untuk melakukan bagian pengunggahan file menggunakan API baru. Ini setara dengan panggilan CURL yang diuraikan di atas untuk mengunggah satu file. Saya telah mengujinya dengan file 160MB yang gagal dengan API yang didokumentasikan . Ini juga menggunakan permintaan (yang digunakan oleh API yang didokumentasikan) dan hanya membuat pengiriman baru dan mengunggah file. Perhatikan bahwa URL yang digunakan adalah yang kotak pasir.

import requests

r = requests.post('https://sandbox.zenodo.org/api/deposit/depositions',
                        params={'access_token': ACCESS_TOKEN}, json={},
                        headers={"Content-Type": "application/json"})

print r.status_code

bucket_url = r.json()['links']['bucket']

filename='bigfile.txt'
r = requests.put('%s/%s' % (bucket_url,filename),
                data=open(filename, 'rb'),
                headers={"Accept":"application/json",
                "Authorization":"Bearer %s" % ACCESS_TOKEN,
                "Content-Type":"application/octet-stream"})

print r.status_code

Semua 6 komentar

Anda harus menggunakan API unggah file baru kami (yang belum kami publikasikan) untuk mendapatkan file yang lebih besar dari 100MB yang diunggah. Ini karena API saat ini menggunakan application/mulitpart-formdata untuk mengunggah file yang tidak terlalu efisien. Di API baru Anda mengalirkan konten biner file dalam permintaan PUT yang jauh lebih cepat dan tidak memerlukan penyandian/penguraian kode apa pun di kedua ujungnya. Saya akan mengirimkan sebuah contoh sedikit kemudian hari ini.

Terima kasih telah menyelidiki ini! Saya senang dengan contoh API baru.
Mungkin Anda ingin mempertimbangkan paket python "requests-toolbelt" yang juga memungkinkan streaming objek data formulir multi-bagian. Tapi saya kira solusi apa pun tanpa persyaratan penyandian dihargai.

Mohon maaf atas keterlambatan membalas yang satu ini:

1) Temukan URL keranjang Anda:

$ curl -H "Accept: application/json" -H "Authorization: Bearer <access token>" "https://www.zenodo.org/api/deposit/depositions/<deposit id>"
{
  "links": {
    "bucket": "https://www.zenodo.org/api/files/<bucket id>",
    ...
  },
...

2) Unggah file ke dalam ember

$ curl -X PUT -H "Accept: application/json" -H "Content-Type: application/octet-stream" -H "Authorization: Bearer <access_token>" -d @<path to local file> https://www.zenodo.org/api/files/<bucket id>/<filename>

Perhatikan bahwa bucket berversi, jadi untuk menghapus file sepenuhnya lagi, Anda harus menggunakan tautan versi. Temukan dari daftar ember:

$ curl -H "Accept: application/json" -H "Authorization: Bearer <access token>" "https://www.zenodo.org/api/files/<bucket id>”
{
  "contents": [
    {
      "links": {
        "version": "https://zenodo.org/api/files/<bucket id>/<filename>?versionId=<versionId>", 
        ...
      }, 
      "key": "<filename>", 
      ...
    }, 
   ...

Menghapus file:

$ curl -X DELETE -H "Accept: application/json" -H "Authorization: Bearer <access_token>" https://www.zenodo.org/api/files/<bucket id>/<filename>?versionId=<versionId>”

Untuk berjaga-jaga jika ada yang menemukan ini, inilah beberapa Python untuk melakukan bagian pengunggahan file menggunakan API baru. Ini setara dengan panggilan CURL yang diuraikan di atas untuk mengunggah satu file. Saya telah mengujinya dengan file 160MB yang gagal dengan API yang didokumentasikan . Ini juga menggunakan permintaan (yang digunakan oleh API yang didokumentasikan) dan hanya membuat pengiriman baru dan mengunggah file. Perhatikan bahwa URL yang digunakan adalah yang kotak pasir.

import requests

r = requests.post('https://sandbox.zenodo.org/api/deposit/depositions',
                        params={'access_token': ACCESS_TOKEN}, json={},
                        headers={"Content-Type": "application/json"})

print r.status_code

bucket_url = r.json()['links']['bucket']

filename='bigfile.txt'
r = requests.put('%s/%s' % (bucket_url,filename),
                data=open(filename, 'rb'),
                headers={"Accept":"application/json",
                "Authorization":"Bearer %s" % ACCESS_TOKEN,
                "Content-Type":"application/octet-stream"})

print r.status_code

@lnielsen @jakelever
Menurut Anda apakah mungkin untuk mengalirkan file yang dipotong ke dalam ember menggunakan requests.put ?
Konteks:
Saya memiliki satu set file besar yang ingin saya zipstream tanpa membuat zipfile di memori atau di disk sebelumnya. Saya ingin meneruskan objek generator ke aliran oktet dari metode permintaan.

Menemukan ini saat mencoba mengunggah file menggunakan API. Bagi saya, streaming API gagal karena hanya sekitar setengah dari file 986 Kb yang diunggah, menghasilkan PDF yang rusak. Berdasarkan http://killtherradio.net/tricks-hacks/curl-cli-not-sending-full-file-data-when-using-data-binary/ Saya kemudian mengganti -d @<path to file> dengan -T <path to file> di baris perintah curl dan seluruh file diunggah.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat