fetch - Límite faltante en multipart / form-data POST


Gracias por venir.

Quiero enviar un new FormData() como el body de una solicitud POST usando la api fetch

La operación se ve algo como esto

var formData = new FormData()
formData.append('myfile', file, 'someFileName.csv')

fetch('https://api.myapp.com', 
  {
    method: 'POST',
    headers: {
      "Content-Type": "multipart/form-data"
    },
    body: formData
  }
)

El problema aquí es que el límite, algo así como {[13]]}

boundary=----WebKitFormBoundaryyEmKNDsBKjB7QEqu

Nunca llega a la cabecera Content-Type:

Debería verse así

Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryyEmKNDsBKjB7QEqu

Cuando se intenta la" misma " operación con un new XMLHttpRequest(), como so

var request = new XMLHttpRequest()
request.open("POST", "https://api.mything.com")
request.withCredentials = true
request.send(formData)

Los encabezados están correctamente configurados

Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryyEmKNDsBKjB7QEqu

Así que mi pregunta es,

  1. ¿Cómo hago que fetch se comporte exactamente como XMLHttpRequest en esta situación?

  2. Si esto no es posible, ¿por qué?

Gracias a todos! Esta comunidad es más o menos la razón por la que tengo éxito profesional.

Author: sideshowbarker, 2016-09-01

4 answers

La solución al problema es establecer explícitamente Content-Type a undefined para que su navegador o cualquier cliente que esté utilizando pueda configurarlo y agregar ese valor de límite allí para usted. Decepcionante pero cierto.

 50
Author: James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-13 16:04:59

Estoy usando el aurelia-api (un contenedor para aurelia-fetch-client). En este caso, el tipo de contenido predeterminado es 'application / json'. Así que puse el Content-Type en undefined y funcionó como un encanto.

 2
Author: Diego Troitiño,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-12 02:32:14
fetch(url,options)
  1. Si establece una cadena como options.body, debe establecer el Content-Type en el encabezado de la solicitud ,o será text/plain por defecto.
  2. If opciones.el cuerpo es un objeto específico como let a = new FormData() o let b = new URLSearchParams(), no es necesario establecer el Content-Type por hand.It se añadirá automáticamente.

    • para a, será algo así como

    multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

    Como puede ver, el límite se agrega automáticamente.

    • para b es application/x-www-form-urlencoded;
 2
Author: moonreader,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-23 13:14:52

Add headers:{content-type: undefined} el navegador generará un límite para usted esto es para subir un archivo parte y parte con streaming si está agregando 'multiple / form-data' significa que debe crear streaming y cargar su archivo parte y parte

Así que está bien agregar solicitud.headers = {content-type: undefined}

 0
Author: Nver Abgaryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-04 13:04:32