节点/请求错误:“;处理POST请求:无内容类型”;
Node/Request Error: "Processing POST Request: No Content-Type"
我有一个前端Canvas,我将其转换为png文件,需要将其POST到第三方供应商的api。它作为base64文件传递回节点,我对其进行解码,但当我尝试上传时,它会给我以下错误:
处理POST请求时出现问题:未指定内容类型
但是,我在POST调用中明确指定了内容类型。我的最终目标是将文件上传到我的供应商的API。
以下是关键的前端方面:
var canvasImage = document.getElementById("c");
var img = canvas.toDataURL({
multiplier: canvasMultiplier
});
var fileTime = Date.now();
var myFileName = $scope.productCode + fileTime;
$scope.filenameForVendor = myFileName;
var filename = $scope.filenameForVendor;
$http.post('/postVendor', { filename: filename, file: img }).success(function (data) {
console.log("Uploaded to Vendor");
这是后端POST:
app.post('/postVendor', function (req, res, next) {
var filename = req.body.filename;
var file = req.body.file;
fileBuffer = decodeBase64Image(file);
request({
url: "http://myvendorapi/ws/endpoint",
method: "POST",
headers: {
'contentType': fileBuffer.type
},
body: fileBuffer.data
}, function (error, response, body) {
console.log(response);
});
})
// Decode file for upload
function decodeBase64Image(dataString) {
var matches = dataString.match(/^data:([A-Za-z-+'/]+);base64,(.+)$/),
response = {};
if (matches.length !== 3) {
return new Error('Invalid input string');
}
response.type = matches[1];
response.data = new Buffer(matches[2], 'base64');
return response;
}
我可以在前端使用AJAX进行POST,但由于CORS和供应商阻止了对端点的除服务器端调用之外的所有调用(而且他们没有JSONP),我不能使用它。他们允许我的IP通过以进行测试,所以只有我才能从我的机器上完成这项工作:
var send = function (blob) {
var fileTime = Date.now();
var myFileName = $scope.productCode + fileTime;
$scope.filenameForVendor = myFileName;
var filename = $scope.filenameForVendor;
var formdata = new FormData();
formdata.append('File1', blob, filename);
$.ajax({
url: 'http://myvendorapi/ws/endpoint',
type: "POST",
data: formdata,
mimeType: "multipart/form-data",
processData: false,
contentType: false,
crossDomain: true,
success: function (result) {
console.log("Upload to Vendor complete!");
// rest of code here/including error close out
}
var bytes = atob(dataURL.split(',')[1])
var arr = new Uint8Array(bytes.length);
for (var i = 0; i < bytes.length; i++) {
arr[i] = bytes.charCodeAt(i);
}
send(new Blob([arr], { type: 'image/png' }));
更新:
我意识到contentType应该是"content-type"。当我这样做时,它会创建一个没有指定边界的错误,因为我正在尝试多部分表单数据(我做错了)。如何将formData传递到节点进行上传?
更新2:
根据提供的建议,我尝试使用multer,但得到了ReferenceError:XMLHttpRequest未定义。
客户端:
var fileTime = Date.now();
var myFileName = $scope.productCode + fileTime;
$scope.filenameForVendor = myFileName;
var filename = $scope.filenameForVendor;
var formdata = new FormData();
formdata.append('File1', blob, filename);
$http.post('/postVendor', formdata, { transformRequest: angular.identity, headers: { 'Content-Type': undefined } }).success(function (data) {
服务器端:
app.post('/postVendor', function (req, res, next) {
var request = new XMLHttpRequest();
request.open("POST", "http://myvendorapi.net/ws/endpoint");
request.send(formData);
})
为什么对文件进行base64编码?
您可以使用FormData将原始文件上传到您的节点,并且不必解码任何内容。
前端
...
var request = new XMLHttpRequest();
request.open('POST', 'http://node.js/method');
request.send(formData); // vanilla
---或---
...
$http.post('http://node.js/method', formData, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined}
}); // angular
后端
只是安装请求。
...
var request = require('request');
app.post('/method', function (req, res, next) {
// if you just want to push request you don't need to parse anything
req.pipe(request('http://vendor.net')).pipe(res);
}) // express
相关文章:
- "日期“;AJAX请求返回的类型值未定义
- "所请求的名称已经作为不同类型的“”存在;HTTP 409响应错误
- 在 Angular2 中构建多部分/表单数据 POST 请求并验证输入类型文件
- Angular 2:如何在 GET 和 POST 请求中设置 double、float、int 和布尔类型参数
- 有没有任何方法可以从javascript进行跨域请求,并访问它可能生成的错误响应类型(401404等)
- 为什么当我指定POST时,即使我已经尝试了类型和方法选项,我的ajax代码仍然会触发GET请求
- Swagger'获取'请求在响应时总是以text/html/Accept类型返回,而不是applicat
- 使用 Meteor HTTP 在 Spotify API 上请求access_token时不受支持的授权类型错误
- 检查 HTTP GET 请求返回的文件类型
- 客户端将多部分/表单数据请求的文件部分的内容类型设置错误
- POST 请求标头中的内容类型中缺少表单数据边界
- 如何在 onsubmit 事件中检查请求类型(ajax 或 no)
- 类型错误:在 ASP.NET 中触发 AJAX 请求时,未定义不是一个函数
- Ajax FormData 使用 POST 类型,但在 PHP 文件中无法获取任何请求
- 在 Node.js 服务器内发出异步请求错误:“类型错误:对象 #<对象> 没有方法'_implicitHeader'”
- 一个额外的未知参数,带有数据类型“脚本”的 ajax 请求
- 如何在不使用 Blob 的情况下将内容类型添加到多部分请求
- 根据 Zend Framework 2 中的请求类型在同一路由上触发不同的操作
- 如何更改Ajax请求类型和数据
- js服务调用改变请求类型