Resteasy destroys filename encoding on multipart/form-data POST requests - file-upload

I do a fileupload to the following annotated Restservice
#POST
#Path("/uploadFile")
#Consumes("multipart/form-data")
public Response uploadFile(MultipartFormDataInput input)
When special characters in the filename like "äÄöÖüÜß" are used, the filename gets corrupted during processing of Resteasy subsystem.
I verified this by creating a Logginginterceptor
#Provider
#ServerInterceptor
public class LoggingInterceptor implements PreProcessInterceptor
Inside this interceptor, the http fileupload (multipart/form-data) is still correct
Content-Disposition: form-data; name="file"; filename="TestäÄöÖüÜßFile2.pdf"
Content-Type: application/pdf
when Resteasy calls the uploadFile Method, the filename is corrupted
Content-Disposition: form-data; name="file"; filename="Test��������������File2.pdf"
Content-Type: application/pdf
Is there a possibility (maybe by some annotation) to preserve the filename encoding in the Entity?
Kind regards
Shane

Related

Parse multipart/form-data response in rust / reqwest

I'm relatively new to rust and using reqwest to fetch a PDF document from a REST API endpoint. The content-type of the response is multipart/form-data; boundary=bc1f6465-6738-4b46-9d9d-b9ae36afa8cb with two parts:
--bc1f6465-6738-4b46-9d9d-b9ae36afa8cb
Content-Disposition: form-data; name="metadata"
Content-Type: application/json
{"documentId":"QkNfRENfSUwwMDEsRTA1OEU3ODQtMDAwMC1DNzY5LTg1MjktMTRFRkI5RTBFNjRF"}
--bc1f6465-6738-4b46-9d9d-b9ae36afa8cb
Content-Disposition: form-data; name="document"; filename=document.pdf
Content-Type: application/pdf
%PDF-1.4
<binary content>
%%EOF
--bc1f6465-6738-4b46-9d9d-b9ae36afa8cb--
I want now to save the PDF document in the 2nd part as a valid PDF file on disk. But the multipart functionality within reqwest seems to create new multipart requests whereas I need to parse a multipart response.
My code to download the file:
use reqwest::{self, header::AUTHORIZATION};
fn main() {
let url = "https://example.com/rest/document/123";
let authorization_header = String::from("Bearer ") + access_token.as_str();
let res = client.get(url)
.header(AUTHORIZATION, &authorization_header)
.send()
.expect("Error calling API");
}
Any hint on how to process the multipart/form-data response is appreciated!

Spark Java - strange behavior when uploading files

In my project I want to try to upload files, here is the part of the code responsible for this:
MultipartConfigElement multipartConfigElement =
new MultipartConfigElement(
"/tmp_files",
avatarSize,
avatarSize,
1024
);
request.raw().setAttribute(
"org.eclipse.jetty.multipartConfig",
multipartConfigElement
);
Part uploadedFile = request.raw().getPart("file");
And a request to upload a file using Idea's http client:
POST http://localhost:8080/users/me/avatar
Content-Type: multipart/form-data; boundary=abcd
Authorization: Bearer {{authToken}}
--abcd
Content-Disposition: form-data; name="file"; filename="test.png"
< /Users/user1/resources/test.png
--abcd--
where test.png is a regular picture.
But when I try to load in this code place:
Part uploadedFile = request.raw().getPart("file");
I get an error:
java.nio.file.NoSuchFileException: /tmp_files/MultiPart11851484240893602177
at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
at java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:218)
at java.base/java.nio.file.Files.newByteChannel(Files.java:375)
at java.base/java.nio.file.Files.createFile(Files.java:652)
It can be assumed that this error is due to the fact that there are no write permissions to the root of the file system (I'm testing on mac os, under the user).
But if i try to upload another file - which is just a zip file then everything works.
POST http://{{host}}/users/me/avatar
Content-Type: multipart/form-data; boundary=abcd
Authorization: Bearer {{authToken}}
--abcd
Content-Disposition: form-data; name="file"; filename="file123.zip"
< /Users/18493151/develop/icandev/api-gateway/src/main/resources/file123.zip
--abcd--
and no exception in this line:
Part uploadedFile = request.raw().getPart("file");
Why is this happening? Why does the result depend on the file type?
sparkjava version 2.9.4

.net core web api upload file fail with badrequest

I am trying to upload several files to a web api endpoint with .net core 2.1 web api
this is my controller and the method to upload
[Produces("application/json")]
[Route("api/[controller]")]
[ApiController]
public class PagosController : ControllerBase{
[HttpPost("UploadDescuento")]
public async Task<IActionResult> UploadDescuento(IEnumerable<IFormFile> files)
{
return Ok();
}
}
with postman i made a request to de controller but i am getting a badrequest
the first time I thought my request is bad so i do the same request in postman
POST /api/pagos/UploadDescuento HTTP/1.1
Host: localhost:59039
User-Agent: PostmanRuntime/7.16.3
Accept: */*
Cache-Control: no-cache
Postman-Token: 7535f283-89fb-4f86-bbb9-3d78ec302ebe,19a709dd-37c9-48ef-a157-c21f99861260
Host: localhost:59039
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Accept-Encoding: gzip, deflate
Content-Length: 1320022
Connection: keep-alive
cache-control: no-cache
Content-Disposition: form-data; name="files"; filename="/C:/Users/jcpc9/Pictures/0-5616x3744.jpg
------WebKitFormBoundary7MA4YWxkTrZu0gW--,
Content-Disposition: form-data; name="files"; filename="/C:/Users/jcpc9/Pictures/0-5616x3744.jpg
------WebKitFormBoundary7MA4YWxkTrZu0gW--
Content-Disposition: form-data; name="files"; filename="/C:/Users/jcpc9/Pictures/101-2621x1747.jpg
------WebKitFormBoundary7MA4YWxkTrZu0gW--
Content-Disposition: form-data; name="pago"
234235834
------WebKitFormBoundary7MA4YWxkTrZu0gW--
but im getting badrequest
{
"": [
"The input was not valid."
]
}
my solution was remove de attribute ApiController i dont know why the documentation doesnt say to much [https://learn.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-2.2#multipartform-data-request-inference] i dont understend what is the problem
[Produces("application/json")]
[Route("api/[controller]")]
//[ApiController]<<remove this
public class PagosController : ControllerBase
and the method
[HttpPost("UploadDescuento")]
public async Task<IActionResult> UploadDescuento(IEnumerable<IFormFile> files)
if someone know why this propertie "[ApiController]" causing this problema i hope you can explain or at leas an good article
You're not uploading the file. You're just sending the path of the file on the client machine, which the server can't do anything with (unless the server and client machines will always be the same).
Postman does have the option of sending a file properly. See this answer.
You need to select form-data in the body in postman and set up a key "files" as file type example

how to set no content-type using apache httpclient

i am facing one issue on apache httpclient(the latest release)
i am using
builder.addPart("_sid", new StringBody("abcd"));
to build form part, but in server, the request info is:
Content-Disposition: form-data; name="_sid"
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 8bit
i want the http client do not send the two lines:
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 8bit
is there any code could help me?
refer to In apache http client, how to keep the Content-Type in a StringBody as empty or null? , i get the key:
- FormBodyPart bodyPart = new FormBodyPart("_sid", new StringBody(sessionID, ContentType.DEFAULT_TEXT)) {
#Override
protected void generateContentType(ContentBody body) {
}
#Override
protected void generateTransferEncoding(final ContentBody body){
}
};

Mime Content-Type name is gibberish

What follows is a snippet from a raw email:
Content-Type: application/octet-stream;
name="�밶ó���Ĵ������˼�Ӧ��.xls"
I have attempted to parse the name as a Base64 encoded string, but it fails that. What could it be?
I have seen the same text for a Content-Disposition filename:
Content-Disposition: attachment;
filename="�밶ó���Ĵ������˼�Ӧ��.xls"
Neither of these will pass the validation in the System.Net.Mime constructors for ContentType and ContentDisposition objects.
For the record, the attachment is a legitimate xls file.