将上传的文件保存到NodeJS中的Pinata IPFS



我一直在尝试将上传的图像文件保存到NodeJs中的IPFS中,虽然Pinata似乎保存了它们,但这些文件几乎是胡言乱语(下载图像后被破坏(。

我的代码:

// Nodejs route.
exports.postImage = async (req, res, next) => {
// Using multer to get the file.
fileUploadMiddleware(req, res, async (err) => {
// getting bunch of data from query string.
let meta = {
origin,
originid,
context,
ownerid,
format
} = req.query;
if(!meta.format || !req.files) {
return next(new ErrorResponse("File format not specified", 404));
}
if(!meta.originid) {
meta.originid = uuidv4();
}        

// NOTE: is this the right way to get the data of the file ?
const buffer = req.files[0].buffer;

const filename = `${metadata.origin}_${metadata.originid}.${ metadata.format }`;
let stream;
try {
stream = Readable.from(buffer);
// HACK to make PINATA WORK.
stream.path = filename;
}
catch(e) {
logger.logError(e);
return false;
}
const options = {
pinataMetadata: {
name: filename,
keyvalues: {
context: metadata.context,
ownerid: metadata.ownerid
}
},
pinataOptions: {
cidVersion: 0
}
};
try {
var result = await pinata.pinFileToIPFS(stream, options);
console.log("SUCCESS ", result);
return result;
}
catch(e) {
logger.logError(e);
return null;
}
res.status(200).json({
success: true,
data: 'You got access'
})
});
}

因此,基本上是基于上传的文件缓冲区创建流,并将其发送到Pinata。我哪里错了?

const buffer = req.files[0].buffer;

如果您使用MemoryStorage。缓冲区属性将可用。它不适用于diskStorage,因为它将在本地保存文件。:

const storage = multer.memoryStorage()
const upload = multer({ storage: storage })

我也认为它不是req.files[0]

const buffer = req.file.buffer;

在我得到缓冲区后,我使用表单数据npm包将其转换为FormData

import FormData from "form-data";
const formData = new FormData();
formData.append("file", buffer, {
contentType,
filename: fileName + "-" + uuidv4(),
});

然后你向pinata 发送邮件请求

const url = `https://api.pinata.cloud/pinning/pinFileToIPFS`;
const fileRes = await axios.post(url, formData, {
maxBodyLength: Infinity,
headers: {
// formData.getBoundary() is specific to npm package. native javascript FormData does not have this method
"Content-Type": `multipart/form-data: boundary=${formData.getBoundary()}`,
pinata_api_key: pinataApiKey,
pinata_secret_api_key: pinataSecretApiKey,
},
});

最新更新