1

当我在上传区域中放置文件时,React-dropzone返回一个对象,例如:

let picture = [
    {
        "rawFile": {
            "preview": "blob:http://localhost:3000/ff851b03-b2c0-4212-9240-8d07057ad47d"
        },
        "src": "blob:http://localhost:3000/ff851b03-b2c0-4212-9240-8d07057ad47d",
        "title": "1397-01-20 13.43.24.jpg"
    }
]

我阅读了此链接并尝试上传文件:React dropzone,如何上传图片?

但我认为文件不会被发送。

这是我的代码:

let formData = new FormData();
formData.append('file', picture[0]);
fetch('http://localhost:8000/api/media', {
 method: 'POST',
 body: formData
});

如果这种方法不正确,如何将文件发送到服务器端并在服务器端接收?

在服务器端,我使用的是 Hapij。

4

1 回答 1

3

我解决了这个问题。我写答案是因为没有人回答这个问题。

在客户端,我使用FileReaderAPI 读取 BLOB 数据并将其转换为base64可读格式。我编写了一个函数来将 blob 转换为 base64 并发送到服务器端fileNamebase64

const convertFileToBase64 = file => new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file.rawFile);

    reader.onload = () => resolve({
        fileName: file.title,
        base64: reader.result
    });
    reader.onerror = reject;
});

在服务器端,我通过这个函数将缓冲区写入文件:

const fs = require("fs");
const Boom = require('boom');

function convertBase64ToFile(file) {

  let base64Data = file.base64.split(',')[1];

  fs.writeFile(`${__dirname}/../../uploads/${file.fileName}`, base64Data, 'base64', function(err) {
    return Boom.badData(err);
  });

  // Other actions...

}

这种方法非常适合我。

于 2018-04-13T08:45:48.853 回答