节点/请求错误:“;处理POST请求:无内容类型”;

Node/Request Error: "Processing POST Request: No Content-Type"

本文关键字:请求 类型 POST 节点 处理 错误      更新时间:2023-09-26

我有一个前端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
相关文章: