У меня возникают проблемы, когда я пытаюсь загрузить изображение из моего собственного приложения через мой узел-экспресс-сервер в Google Cloud Storage. Использование загрузки изображений почтальона без каких-либо проблем, но когда я пытаюсь загрузить изображение, используя Fetch / Axios, я просто получаю 400 с сообщением об ошибке.
Вот реагирующая собственная версия:
const fData = new FormData();
fData.append('image', {
uri: imageFilePath,
type: imagePickedType,
file: imagePickedName
});
fData.append('email', email);
fData.append('file', imagePickedName);
fData.append('type', imagePickedType);
const config = {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'multipart/form-data',
},
body: fData,
};
fetch("http://192.168.43.194:3000/api/v1/auth/uploadavatar", config)
.then(response => response.json()).then(results => {
console.log("RespRespResp >>>> ", results);
}).catch((error)=>{
console.log("ErrorErrorError >>>", error);
});
Вот как этонаходится в почтальоне. Успешно загружено изображение с 200 статусами
Вот серверная часть nodejs:
route v1.js:
const multer = Multer({
storage: Multer.MemoryStorage,
limits: {
fileSize: 10 * 1024 * 1024, // Maximum file size is 10MB
},
});
router.post('/auth/uploadavatar', multer.single('image'), gcsMiddlewares.sendUploadToGCS, auth.uploadAvatar);
Промежуточное ПО GCS:
const {Storage} = require('@google-cloud/storage');
const gcsHelpers = require('../helpers/google-cloud-storage');
const GOOGLE_CLOUD_PROJECT_ID = '************'; // Replace with your project ID
const path = require('path');
const GOOGLE_CLOUD_KEYFILE = ************; // Replace with the path to the downloaded private key
// const storage = new Storage();
const storage = new Storage({
projectId: GOOGLE_CLOUD_PROJECT_ID,
keyFilename: GOOGLE_CLOUD_KEYFILE,
});
const DEFAULT_BUCKET_NAME = '************'; // Replace with the name of your bucket
/**
* Middleware for uploading file to GCS.
* @param {Object} req
* @param {Object} res
* @param {Function} next
* @return {*}
*/
exports.sendUploadToGCS = (req, res, next) => {
if (!req.file) {
return next();
}
const bucketName = req.body.bucketName || DEFAULT_BUCKET_NAME;
const bucket = storage.bucket(DEFAULT_BUCKET_NAME);
const gcsFileName = `${Date.now()}-${req.file.originalname}`;
const file = bucket.file(gcsFileName);
const stream = file.createWriteStream({
metadata: {
contentType: req.file.mimetype,
},
});
stream.on('error', (err) => {
req.file.cloudStorageError = err;
next(err);
});
stream.on('finish', () => {
req.file.cloudStorageObject = gcsFileName;
return file.makePublic()
.then(() => {
req.file.gcsUrl = gcsHelpers.getPublicUrl(bucketName, gcsFileName);
next();
});
});
stream.end(req.file.buffer);
};
.. / helpers / google-cloud-storage.js:
/**
* Copy file from local to a GCS bucket.
* Uploaded file will be made publicly accessible.
*
* @param {string} localFilePath
* @param {string} bucketName
* @param {Object} [options]
* @return {Promise.<string>} - The public URL of the uploaded file.
*/
exports.getPublicUrl = (bucketName, fileName) => `https://storage.googleapis.com/${bucketName}/${fileName}`;
auth.uploadAvatar:
exports.uploadAvatar = (req, res, next) => {
const state = req.body;
if (req.file && req.file.gcsUrl) {
state.avatarUrl = req.file.gcsUrl;
return res.status(200).send(state);
}
return res.status(400).send({error: "Couldn't upload image"});
}
Infact whatЯ заметил, что при использовании Fetch / Axios в моем приложении-адаптере изображение принимается в req.body с такой структурой req на узле-экспрессе и без req.file:
body: [Object: null prototype] {
email: 'foobar@barfoo.com',
file: 'IMG-20191108-WA0000.jpg',
type: 'image/jpeg',
image: '����\u0000\u0010JFIF\u0000\u0001\u....' &TLDR
}
при использованииПочтальон для загрузки изображения, структура req похожа на req.body, а также req.file:
body: [Object: null prototype] {},
file: {
fieldname: 'image',
originalname: '289489.png',
encoding: '7bit',
mimetype: 'image/png',
buffer: <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 03 20 00 00 03 19 08 06 00 00 00 f8 05 50 0d 00 00 00 09 70 48 59 73 00 00 0b 13 00 00 0b 13 01 ... 1175161 more bytes>,
size: 1175211
}