Zenodo: Échec du téléchargement d'un fichier plus volumineux via l'API vers le bac à sable

Créé le 26 sept. 2016  ·  6Commentaires  ·  Source: zenodo/zenodo

Bonjour,

lorsque j'essaie de télécharger un fichier de test > 100 Mo via des requêtes python et l'API Zenodo (bac à sable) en utilisant le code suivant

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)

il renvoie le code d'erreur http 413 ("413 Request Entity Too Large" qui n'est d'ailleurs pas documenté dans la documentation de l'API zenodo).

Le même code testé avec des fichiers < 100 Mo fonctionne et renvoie 201 .

Ai-je atteint la limite de taille de fichier ? (si c'est le cas, il serait bon de l'ajouter à la documentation). Ou peut-être est-ce dû au package "demandes" - dois-je mettre les données en plusieurs parties ?

Enhancement

Commentaire le plus utile

Juste au cas où quelqu'un rencontrerait cela, voici du Python pour effectuer la partie de téléchargement de fichiers à l'aide de la nouvelle API. Cela équivaut à l'appel CURL décrit ci-dessus pour télécharger un seul fichier. Je l'ai testé avec un fichier de 160 Mo qui a échoué avec l' API documentée . Cela utilise également des requêtes (que l'API documentée utilise) et fait simplement une nouvelle soumission et télécharge un fichier. Notez que l'URL utilisée est celle du bac à sable.

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

Tous les 6 commentaires

Vous devrez utiliser notre nouvelle API de téléchargement de fichiers (que nous n'avons pas encore publiée) pour télécharger des fichiers de plus de 100 Mo. En effet, l'API actuelle utilise application/mulitpart-formdata pour télécharger le fichier, ce qui n'est pas très efficace. Dans la nouvelle API, vous diffusez le contenu binaire du fichier dans une requête PUT, ce qui est beaucoup plus rapide et ne nécessite aucun encodage/décodage aux deux extrémités. Je vous enverrai un exemple un peu plus tard aujourd'hui.

Merci d'avoir examiné cela ! Je suis enthousiasmé par l'exemple de la nouvelle API.
Vous voudrez peut-être envisager le package python "requests-toolbelt" qui permettrait également de diffuser des objets de données de formulaire en plusieurs parties. Mais je suppose que toute solution sans exigences d'encodage est appréciée.

Toutes nos excuses pour le long délai de réponse à celui-ci :

1) Trouvez l'URL de votre bucket :

$ 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) Télécharger un fichier dans le bucket

$ 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>

Notez que le compartiment est versionné, donc pour supprimer complètement un fichier à nouveau, vous devez utiliser le lien de version. Trouvez-le dans la liste du bucket :

$ 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>", 
      ...
    }, 
   ...

Suppression du fichier :

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

Juste au cas où quelqu'un rencontrerait cela, voici du Python pour effectuer la partie de téléchargement de fichiers à l'aide de la nouvelle API. Cela équivaut à l'appel CURL décrit ci-dessus pour télécharger un seul fichier. Je l'ai testé avec un fichier de 160 Mo qui a échoué avec l' API documentée . Cela utilise également des requêtes (que l'API documentée utilise) et fait simplement une nouvelle soumission et télécharge un fichier. Notez que l'URL utilisée est celle du bac à sable.

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
Pensez-vous qu'il est possible de diffuser un fichier fragmenté dans le bucket en utilisant requests.put ?
Le contexte:
J'ai un ensemble de fichiers volumineux que je souhaite compresser sans créer au préalable de fichier zip en mémoire ou sur disque. Je voudrais passer un objet générateur au flux d'octets de la méthode de requête.

Je suis tombé sur cela en essayant de télécharger des fichiers à l'aide de l'API. Pour moi, l'API de streaming a échoué car seule la moitié environ d'un fichier de 986 Ko a été téléchargée, ce qui a entraîné un PDF corrompu. Sur la base de http://killtheradio.net/tricks-hacks/curl-cli-not-sending-full-file-data-when-using-data-binary/ j'ai ensuite remplacé -d @<path to file> par -T <path to file> dans la ligne de commande curl et l'intégralité du fichier téléchargé.

Cette page vous a été utile?
0 / 5 - 0 notes