2

NodeJSMulterを使用してファイルをS3にアップロードしています。

表面的には、すべてが機能しているように見え、ファイルがアップロードされ、 AWSコンソールbucketにログインするとファイルが表示されます。ただし、ほとんどの場合、ファイルへのリンクをたどると、ファイルが壊れていて、ファイルのサイズが元のファイルよりもはるかに小さいことがよくあります。

ファイルがサーバーに到達すると、ファイル サイズは正しいですlogが、S3でははるかに小さくなります。たとえば、151kb のファイルをアップロードしたとします。リクエストはpostファイル サイズを正しくログに記録しますが、S3ではファイルは 81kb と表示されます。

クライアント側:

uploadFile = (file) ->
    formData = new FormData()
    formData.append 'file', file


    xhr = new XMLHttpRequest()
    xhr.open "POST", "/upload-image", true
    # xhr.setRequestHeader("Content-Type","multipart/form-data");

    console.log 'uploadFile'

    xhr.onerror = ->
        alert 'Error uploading file'
    xhr.onreadystatechange = ->
        if xhr.readyState is 4
            console.log xhr.responseText

    xhr.send formData

サーバ:

app.use(multer({ // https://github.com/expressjs/multer
      inMemory: true,
      limits : { fileSize:3000000 },
      rename: function (fieldname, filename) {
        var time = new Date().getTime();
        return filename.replace(/\W+/g, '-').toLowerCase() + '_' + time;
      },
      onFileUploadData: function (file, data, req, res) {
        var params = {
          Bucket: creds.awsBucket,
          Key: file.name,
          Body: data,
          ACL: 'public-read'
        };

        var s3 = new aws.S3();
        s3.putObject(params, function (perr, pres) {
          if (perr) {
            console.log("Error uploading data: ", perr);
          } else {
            console.log("Successfully uploaded data", pres);
          }
        });
      }
    }));

    app.post('/upload-image', function(req, res){
        if (req.files.file === undefined){
            res.end("error, no file chosen");
        } else if (req.files.file.truncated) {
            res.end("file too large");
        } else {
          console.log(req.files.file.size); //logs the correct file size
          var path = creds.awsPath + req.files.file.name;
          res.type('text/plain');
          res.write(path);
          res.end();
        };

    });

編集:

パーマの設定file.bufferはうまくいっているようですが、これは適切な方法ではなく、後で噛み付く可能性があると感じています。このアプローチは大丈夫ですか、またはこれを行う際に注意すべき問題はありますか?bodyonFileUploadComplete

4

0 に答える 0