En mi aplicación Vue tengo esta entrada de archivo :
<input type="file" multiple @input="handleFileInput" />Los archivos seleccionados se pasan a mi este método de carga:
public async uploadFiles(file: File) { [...] const formData = new FormData(); formData.append('fileName', file.name); formData.append('file', file); [...] await axios.post('my-upload-url', formData); }El registro js antes de enviarlo:
El registro de red después de enviarlo:
Mi controlador Resteasy responde:
@POST @Transactional @Consumes(MediaType.MULTIPART_FORM_DATA) public Response uploadMultipartData(@MultipartForm @Valid MyDto dto) { // dto.file -> my file }El DTO:
public class MyDto { @NotNull @FormParam("file") @PartType(MediaType.APPLICATION_OCTET_STREAM) public InputStream file; }Al transferir otros tipos de archivos (pdf, png, jpg, mp3, ...), el archivo se encuentra en el InputStream del DTO como se esperaba. Sin embargo, cuando el archivo es un archivo .eml, InputStream es nulo.
Actualización: al cambiar el nombre del archivo de text.eml a test.txt, la carga funciona.
¿Por qué?
En otras palabras, ¿cómo consumo un archivo con un tipo de contenido de mensaje/rfc822 en mi REST Api? ¿Necesito un método separado que acepte este tipo de medio específico?
Entonces, esto ciertamente tiene que ver con la forma en que su servidor maneja el archivo cargado. application/octet-stream simplemente representa un archivo binario genérico/desconocido. De RFC 2046 § 4.5.1:
El subtipo "octet-stream" se utiliza para indicar que un cuerpo contiene datos binarios arbitrarios.
La mayoría de las aplicaciones intentarán determinar el tipo MIME del archivo mirando la extensión de su archivo, pero tendrán problemas para determinarlo si la extensión es desconocida para ellos. Un archivo eml es solo un archivo de texto, lo que explica por qué al cambiar la extensión a txt funciona sin problemas. La forma más fácil de verificar esto es tomar un archivo txt simple y cambiar su extensión a unknown (por ejemplo) e intentar cargar ese archivo.
He configurado un ejemplo que replica exactamente el mismo escenario y, en este caso, el servidor no tiene problemas para leer el contenido del archivo.