Ошибка загрузки файла из реакции на firebase - PullRequest
1 голос
/ 17 июня 2020

Я пытаюсь загрузить файл с моего сайта реакции в хранилище firebase. Файл хранится в firebase, но не в правильном формате (pdf), и я также не могу открыть файл. Когда я загружаю файл от почтальона, он работает.

Мой код для загрузки файла:

onUploadFile = (event, authUser) => {
    const {files} = this.state;

    let reader = new FileReader();

    reader.readAsDataURL(files[0]);
    reader.onload = async (e) => {
        const url = "https://us-central1-xxxxxx-4853a.cloudfunctions.net/uploadFileFirebase";
        const fileNameResult = await fetch(e.target.result).then(res => res.blob());
        const data = new FormData();
        data.append(files[0].name, fileNameResult);
        return axios.post(url, data, {
            headers: {
                "Content-Type": "multipart/form-data"
            }
        })
        .then(response => console.log('result', response));
    };

    event.preventDefault();
};

В node js Я написал:

exports.uploadFileFirebase = functions.https.onRequest((req, res) => {
    cors(req, res, () => {

        if (req.method !== "POST") {
            return res.status(500).json({
                message: "Not allowed"
            });
        }

        const busboy = new Busboy({headers: req.headers});

        console.log(busboy);

        let uploadData = null;
        let fileName = null;
        busboy.on("file", (fieldname, file, filename, encoding, mimetype) => {
            console.log('in file');
            try {
                console.log('filename ==>');
                console.log(filename);
                fileName = filename;
                const filepath = path.join(os.tmpdir(), filename);
                uploadData = {file: filepath, type: mimetype};

                file.pipe(fs.createWriteStream(filepath));
            } catch (e) {
                console.log(e);
            }
        });

        busboy.on("finish", () => {
            const bucket = gcs.bucket("xxxxxxx-4853a.appspot.com"); //TODO make map with company reference
            bucket.upload(uploadData.file, {
                uploadType: "media",
                metadata: {
                    metadata: {
                        contentType: uploadData.type
                    }
                }
            })
            .then(() => {
                return res.status(200).json({
                    message: 'file uploaded'
                });
            })
            .catch(err => {
                return res.status(500).json({
                    error: err.toString()
                });
            });
        });
        busboy.end(req.rawBody);
    });
});

файл сохраняется в хранилище под именем «blob». И имеет следующие данные:

[! [Введите здесь описание изображения] [1]] [1]

Я также продолжаю извлечение данных из файла, данные извлекаются правильно. Как правильно сохранить файл с правильным именем файла и в формате pdf, чтобы я мог открыть файл, например, в firebase.

Есть какие-нибудь мысли?

Решение для открытия файла в firebase добавляет uuid в метаданные.

metadata: {
                    metadata: {
                        contentType: uploadData.type,
                        firebaseStorageDownloadTokens: '1f040c40-6000-48c6-8320-4fa41d9b1730 '
                    }
                }

1 Ответ

1 голос
/ 17 июня 2020

formdata.append имеет третий параметр для имени файла:


data.append(files[0].name, fileNameResult, files[0].name);

Добавьте свойство name в blob:

fileNameResult.name = files[0].name

Перед добавлением его в formdata.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...