I'm trying to upload a xlsx file to server, but I receive two different errors, whether I specify the contentType in the http request header or not. If I specify "Content-type: multipart/form-data" I get the following error:
FileUploadException: the request was rejected because no multipart
boundary was found
Then, if I do not specify the content type (as proposed in different answers), I get this error:
current request is not a multipart request
This is what I do to upload the file. HTML (input fired by a button that calls an uploadFile() method):
<input type="file" #fileUpload id="fileUpload" name="fileUpload" accept=".xlsx" style="display:none;" />
.ts:
uploadFile() {
const fileUpload = this.fileUpload.nativeElement;
fileUpload.onchange = () => {
this.file = fileUpload.files[0];
this.uploadFileToServer();
};
fileUpload.click();
}
uploadFileToServer() {
const formData = new FormData();
formData.append('file', this.file);
this.importService.uploadFile(formData).subscribe(d => {
});
}
In the service the method does this:
this.http.post(
apiUrl,
formData,
options
);
where in options there are the specified headers:
let applicationHeaders = new HttpHeaders();
applicationHeaders = applicationHeaders.append('Content-type', 'multipart/form-data');
multipart or blank.
In the POST request in the request payload I have:
------WebKitFormBoundarytNckytdr7I8wQcuc
Content-Disposition: form-data; name="file"; filename="Template (2).xlsx"
Content-Type: application/octet-stream
------WebKitFormBoundarytNckytdr7I8wQcuc--
Related
We have an API that has multiple different endpoints, as you'd expect. We have the requirement to add a new endpoint which will return an application/pdf along with the file data.
To do this, we return the following:
return {
statusCode: 200,
headers: {
'Content-Type': 'application/pdf',
'Content-disposition': `attachment; filename=${filename}.pdf`,
'Accept': 'application/pdf',
},
body: fileData,
isBase64Encoded: true,
};
The isBase64Encoded only works when a binary media type is set in the API Gateway. As detailed here:
https://medium.com/#ngchiwang/aws-api-gateway-lambda-return-binary-image-ba8faa660839
The issue we have is that by setting the binary media type to * / * (no spaces) on the API Gateway, this, in turn, affects all other endpoints on the API.
Example This breaks one endpoint on the OPTIONS cors check, returning an InternalServerErrorException without reason. This endpoint is just a GET with no data in the request.
Does this mean we need a separate API just for this one endpoint, or is there a way we can include this in the same APIG?
For further clarification, this is a POST that includes a small amount of JSON in the request: {"someValue":1234} and returns the above application/pdf content type.
I'm just tackling this issue and resolved it like this:
Send base 64 string just as normal json response and handle the pdf part on the client
const sendRes = (status:number, body:any) => {
var response = { statusCode: status, headers: { "Content-Type": "application/json" }, body: JSON.stringify(body) };
return response;
};
return sendRes(201, {pdf:your-base64-string} );
Then on the client (Nuxt in my case):
let res = await this.$store.dispatch('pdf/makePdf')
const linkSource = `data:application/pdf;base64,${res.data.pdf}`;
const downloadLink = document.createElement("a");
const fileName = "your-pdf-filename.pdf";
downloadLink.href = linkSource;
downloadLink.download = fileName;
downloadLink.click();
This open a download window and lets you save the file locally
According to this question:
Angular5 HttpClient send data but server can not understand its params
I send username, password and _token parameters to server through FormData in angular5. I set header to
'Content-Type': 'application/x-www-form-urlencoded'
now, I faced another problem in server.
Request header changed to
------WebKitFormBoundaryGOu5izF9uMKIXDW1
Content-Disposition: form-data; name:"username"
a#a.com
------WebKitFormBoundaryGOu5izF9uMKIXDW1
Content-Disposition: form-data; name="password"
123456
------WebKitFormBoundaryGOu5izF9uMKIXDW1
Content-Disposition: form-data; name="_token"
[object Object]
------WebKitFormBoundaryGOu5izF9uMKIXDW1--
Now, Laravel could not read request parameters in this way:
$request->input('username') // returns null
$request->input() // returns whole request content, not an object or array
How could I read request parameters ?
e.g. Is there any regular expression that can help me? or any patches in higher Laravel versions that I can use?
Laravel version: 5.2
Does your controller in Laravel have these included?
use Illuminate\Http\Request;
use Illuminate\Http\Response;
and does your function look like this?
public function signIn(Request $request, Response $response){
$output = $request->input('username');
return $output;
}
What we are doing above is getting the output of the response which we are wanting username and return that so you should get the username back
EDIT
Does your Angular service look like this
login(username:string, password:string) {
let formData = new FormData();
formData.append('username', username);
formData.append('password', password);
return this._http.post(
'http://oauth-api/api/me/signin',
formData
);
}
I am trying to send HTTP multipart request using Google Drive API to insert file in Google Drive.
I am following the link below : Multipart upload
However, I am getting a Bad request error.
Below is the request string which I have created using the documentation link above:
String content = '\r\n--' + boundary + '\r\n';
content +='Content-Type: '+'application/json; charset=UTF-8'+'\r\n\r\n';
content +='{' + '\r\n';
content +='"title": "My File"'+'\r\n';
content +='}'+'\r\n\r\n';
content += '--'+boundary + '\r\n';
content +='Content-Type: '+'text/plain'+'\r\n';
content += EncodingUtil.base64Encode(b)+'\r\n';
content += '-'+boundary+'-\r\n';
Please can someone tell me what I am missing here ??
I was having trouble with this as well,
but if you look at the code for the google drive API on github:
Github Drive API
The request parameters accept a media object, which can have a body and mimeType.
I was working with a service account, and this lets you upload files directly to drive.
auth.getApplicationDefault(function(err, authClient) {
if (err) {
console.log('Authentication failed because of ', err);
return;
}
if (authClient.createScopedRequired && authClient.createScopedRequired()) {
var scopes = ['https://www.googleapis.com/auth/drive'];
authClient = authClient.createScoped(scopes);
}
var request = {
project: "YOUR_PROJECT",
auth: authClient,
resource: {
parents: ['blah']
},
media: {
body: 'hi',
mimeType: 'text/plain'
}
};
drive.files.create(request, function(err, result) {
if (err) {
console.log(err);
} else {
console.log(result);
}
});
});
I had this problem too and after trying some changes I finally reached a working example:
Header :
POST /upload/drive/v2/files?uploadType=multipart&access_token=ya29.CjAmA2j6eonCiROaNum-V1cWdFVH2vXpNiXAsXK6iLPu7K54tD4uNsmH-eEycMcnaBE HTTP/1.1
Host: www.googleapis.com
Accept: */*
Content-Type: multipart/related; boundary="foo_bar_baz"
Content-Length: 150
remember to add boundary="foo_bar_baz" in Content-Type field
Body :
--foo_bar_baz
Content-Type: application/json; charset=UTF-8
{
"title": "My File"
}
--foo_bar_baz
Content-Type: text/txt
JPEG data
--foo_bar_baz--
I am trying to post an image using the source parameter (Multipart/form-data) in the Graph API explorer. My source parameter looks like this:
{Content-Type: multipart/form-data; boundary=xxxsrixxx
--xxxsrixxx
Content-Disposition: attachment; filename=try2.gif
Content-Type: image/gif
Content-Transfer-Encoding: binary,base64
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
--xxxsrixxx--}
This always seems to return
{
"error": {
"message": "(#324) Requires upload file",
"type": "OAuthException",
"code": 324
}
}
Few questions:
Does facebook source parameter accept base64 encoded image data?
Has anyone tried using the source parameter in the graph api explorer and have a working sample?
should the source param value should be url-encoded?
Note: My access token has all the required permissions and if i am not wrong, my encoding seems to be wrong. The base64 encoded text above is a complete image and i could decode it and get the image.
Ok. This is going to sound crazy. After a week of trying I was able to post an image successfully to the facebook wall. The fix was to send the raw binary data as it is (no base64 encoding - fb does not like it) and make sure your multipart/form-data is correct. For instance, if you boundary is defined as "boundary=--xxxsrixxx" your actual request should look like this "----xxxsrixxx\r\nContent-Disposition......\r\n----xxxsrixxx"
This works fine for me, it only uses native JavaScript features and a file input:
const fileReader = new FileReader();
const file = document.getElementById('imageInput').files[0];
fileReader.onloadend = async () => {
const photoData = new Blob([fileReader.result], {type: 'image/jpg'});
const formData = new FormData();
formData.append('access_token', pageAccessToken);
formData.append('source', photoData);
formData.append('message', 'some status message');
let response = await fetch(`https://graph.facebook.com/${pageId}/photos`, {
body: formData,
method: 'post'
});
response = await response.json();
console.log(response);
};
fileReader.readAsArrayBuffer(file);
More information: http://www.devils-heaven.com/facebook-javascript-sdk-photo-upload-with-formdata/
I'm doing straight-to-S3 multipart file upload via AJAX. Everything works fine under all browsers but IE.
S3 requires an Authorization HTTP header in each POST request which contains the signature of the file slice being uploaded.
It appears IE strips out this header from the request, yielding a 403 response.
What's more funny is that IE does not strip another custom S3 header: x-amz-date.
Any idea how I can force the 'Authorization' header in?
As requested, here is my code :
initiateUpload: function() {
var response = this.sign({method:'POST', path: this.key + '?uploads'});
this.request({
method: 'POST',
url: response.url,
headers: {
'x-amz-date': response.date,
'Authorization': response.signature
},
onLoad: this.uploadParts.bind(this)
});
},
request: function(params){
var xhr = new XMLHttpRequest();
if (params.onLoad) xhr.addEventListener("load", params.onLoad, false);
if (params.onUploadStart) xhr.upload.onloadstart = params.onUploadStart;
if (params.onUploadProgress) xhr.upload.onprogress = params.onUploadProgress;
xhr.open(params.method, params.url, true);
for (h in params.headers)
xhr.setRequestHeader(h, params.headers[h]);
xhr.send(params.body);
},