Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AWS S3文件与Node.js一起上载:不支持的正文负载错误_Javascript_Node.js_Amazon Web Services_Amazon S3_Backend - Fatal编程技术网

Javascript AWS S3文件与Node.js一起上载:不支持的正文负载错误

Javascript AWS S3文件与Node.js一起上载:不支持的正文负载错误,javascript,node.js,amazon-web-services,amazon-s3,backend,Javascript,Node.js,Amazon Web Services,Amazon S3,Backend,我正试图让我的node.js后端上传一个文件到AWS S3,它是在我前端的post请求中得到的。这就是我的函数的外观: async function uploadFile(file){ var uploadParams = {Bucket: '<bucket-name>', Key: file.name, Body: file}; s3.upload (uploadParams, function (err, data) { if (err) { co

我正试图让我的node.js后端上传一个文件到AWS S3,它是在我前端的post请求中得到的。这就是我的函数的外观:

async function uploadFile(file){

  var uploadParams = {Bucket: '<bucket-name>', Key: file.name, Body: file};

  s3.upload (uploadParams, function (err, data) {
    if (err) {
      console.log("Error", err);
    } if (data) {
      console.log("Upload Success", data.Location);
    }
  });

}
文件上载服务的
postFile(fileToUpload:File)
方法用于发出post请求:

  postFile(fileToUpload: File): Observable<Boolean> {
    console.log(fileToUpload.name);
    const endpoint = '/api/fileupload/single';
    const formData: FormData = new FormData();
    formData.append('fileKey', fileToUpload, fileToUpload.name);
    return this.httpClient
      .post(endpoint, formData/*, { headers: yourHeadersConfig }*/)
      .pipe(
        map(() => { return true; }),
        catchError((e) => this.handleError(e)),
      );
  }
非常感谢您帮助解决此问题


最好的问候,塞缪尔,最好的方法是流式传输文件。假设你是。从磁盘读取它。你可以这样做

const fs = require("fs");
const aws = require("aws-sdk");
const s3Client = new aws.S3();
const Bucket = 'somebucket';
const stream = fs.createReadStream("file.pdf");
const Key = stream.path;

const response = await s3Client.upload({Bucket, Key, Body: stream}).promise();
console.log(response);

最好的方法是流式处理文件。假设你是。从磁盘读取它。你可以这样做

const fs = require("fs");
const aws = require("aws-sdk");
const s3Client = new aws.S3();
const Bucket = 'somebucket';
const stream = fs.createReadStream("file.pdf");
const Key = stream.path;

const response = await s3Client.upload({Bucket, Key, Body: stream}).promise();
console.log(response);

正文必须是缓冲区、类型化数组、Blob、字符串或ReadableStream。它是什么类型?@jarmod当我使用
typeof
记录数据类型时,我得到了日志:
object
。如果有必要的话,我最初上传的文件是.pdf。我尝试使用:
Buffer.from(JSON.stringify(file),'utf-8')
将文件转换为类型Buffer,但这对我不起作用。谢谢你的帮助!如何创建
文件
对象?你能添加代码吗?@jarmod谢谢你的快速回复。我编辑了我的问题并加入了代码。顺致敬意,您已经显示了客户端代码,但关键是服务器端代码。接收已发布文件并将每个文件提供给“上载到S3”函数的代码。你在服务器端做什么来接受上传的文件?例如,您可以使用中间件将其持久化到磁盘,也可以使用Express以特定格式将文件内容传递给您。正文需要是缓冲区、类型化数组、Blob、字符串或ReadableStream。它是什么类型?@jarmod当我使用
typeof
记录数据类型时,我得到了日志:
object
。如果有必要的话,我最初上传的文件是.pdf。我尝试使用:
Buffer.from(JSON.stringify(file),'utf-8')
将文件转换为类型Buffer,但这对我不起作用。谢谢你的帮助!如何创建
文件
对象?你能添加代码吗?@jarmod谢谢你的快速回复。我编辑了我的问题并加入了代码。顺致敬意,您已经显示了客户端代码,但关键是服务器端代码。接收已发布文件并将每个文件提供给“上载到S3”函数的代码。你在服务器端做什么来接受上传的文件?例如,您可以使用中间件将其持久化到磁盘,或者您可以使用Express以特定格式将文件内容传递给您。我不是从磁盘读取文件。我正在开发一个web应用程序,用户在angular前端上传他们的文件,然后将文件发布到后端,后端应该会上传这些文件。能否在前端创建一个流并将其传递到后端?我没有从磁盘读取文件。我正在开发一个web应用程序,用户在angular前端上传他们的文件,然后将文件发布到后端,后端应该会上传这些文件。是否可以在前端创建流并将其传递到后端?
  app.post('/api/fileupload/single', async (req, res) => {
    try {
        if(!req.files) {
            res.send({
                status: false,
                message: 'No file uploaded'
            });
        } else {

            let file = req.files.fileKey;
            uploadFile(file);

            //send response
            res.send({
                status: true,
                message: 'File is uploaded',
                data: {
                    name: file.name,
                    mimetype: file.mimetype,
                    size: file.size
                }
            });
        }
    } catch (err) {
        res.status(500).send(err);
    }
  });
const fs = require("fs");
const aws = require("aws-sdk");
const s3Client = new aws.S3();
const Bucket = 'somebucket';
const stream = fs.createReadStream("file.pdf");
const Key = stream.path;

const response = await s3Client.upload({Bucket, Key, Body: stream}).promise();
console.log(response);