Zenodo: No se pudo cargar un archivo más grande a través de la API en la zona de pruebas

Creado en 26 sept. 2016  ·  6Comentarios  ·  Fuente: zenodo/zenodo

Hola,

cuando intento cargar un archivo de prueba> 100 MB a través de solicitudes de Python y la API de Zenodo (caja de arena) usando el siguiente código

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)

devuelve el código de error http 413 ("413 Request Entity Too Large", que por cierto no está documentado en la documentación de la API de zenodo).

El mismo código probado con archivos <100 MB funciona y devuelve 201 .

¿He alcanzado el límite de tamaño de archivo? (si es así, sería bueno agregar esto a la documentación). O tal vez esto se deba al paquete de "solicitudes": ¿tengo que poner los datos en varias partes?

Enhancement

Comentario más útil

En caso de que alguien se encuentre con esto, aquí hay algo de Python para hacer la parte de carga de archivos usando la nueva API. Esto es equivalente a la llamada CURL descrita anteriormente para cargar un solo archivo. Lo probé con un archivo de 160 MB que falló con la API documentada . Esto también usa solicitudes (que usa la API documentada) y simplemente realiza un nuevo envío y carga un archivo. Tenga en cuenta que la URL utilizada es la de la zona de pruebas.

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

Todos 6 comentarios

Tendrá que usar nuestra nueva API de carga de archivos (que aún no hemos publicado) para cargar archivos de más de 100 MB. Esto se debe a que la API actual usa application/mulitpart-formdata para cargar el archivo, lo cual no es muy eficiente. En la nueva API, transmite el contenido binario del archivo en una solicitud PUT que es mucho más rápida y no requiere codificación / decodificación en ninguno de los extremos. Te enviaré un ejemplo un poco más tarde hoy.

¡Gracias por examinar esto! Estoy entusiasmado con el ejemplo de la nueva API.
Tal vez desee considerar el paquete de Python "request-toolbelt" que también permitiría la transmisión de objetos de datos de formulario de varias partes. Pero supongo que se agradece cualquier solución sin requisitos de codificación.

Disculpas por la larga demora en responder a este:

1) Busque la URL de su depósito:

$ 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) Cargue un archivo en el depósito

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

Tenga en cuenta que el depósito tiene una versión, por lo que para eliminar completamente un archivo nuevamente, debe usar el enlace de la versión. Encuéntrelo en la lista del cubo:

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

Eliminando el archivo:

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

En caso de que alguien se encuentre con esto, aquí hay algo de Python para hacer la parte de carga de archivos usando la nueva API. Esto es equivalente a la llamada CURL descrita anteriormente para cargar un solo archivo. Lo probé con un archivo de 160 MB que falló con la API documentada . Esto también usa solicitudes (que usa la API documentada) y simplemente realiza un nuevo envío y carga un archivo. Tenga en cuenta que la URL utilizada es la de la zona de pruebas.

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
¿Crees que es posible transmitir un archivo fragmentado al depósito usando requests.put ?
Contexto:
Tengo un conjunto de archivos grandes que quiero zipstream sin crear un archivo zip en la memoria o en el disco de antemano. Me gustaría pasar un objeto generador al flujo de octetos del método de solicitud.

Me encontré con esto al intentar cargar archivos usando la API. Para mí, la API de transmisión falló ya que solo se cargó aproximadamente la mitad de un archivo de 986 Kb, lo que resultó en un PDF corrupto. Basado en http://killtheradio.net/tricks-hacks/curl-cli-not-sending-full-file-data-when-using-data-binary/ Luego sustituí -d @<path to file> con -T <path to file> en la línea de comando de curl y el archivo completo cargado.

¿Fue útil esta página
0 / 5 - 0 calificaciones