我一直试图将上传的图像文件保存到NodeJs中的IPFS中,虽然皮纳塔似乎保存了这些文件,但这些文件几乎是胡说八道(下载后图像被破坏了)。
我的代码:
// 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。我哪里出问题了?
发布于 2022-05-20 04:10:49
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;获得缓冲区后,使用FormData npm包将其转换为表格数据:
import FormData from "form-data";
const formData = new FormData();
formData.append("file", buffer, {
contentType,
filename: fileName + "-" + uuidv4(),
});然后你给皮纳塔发了个邮件请求
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,
},
});https://stackoverflow.com/questions/70202856
复制相似问题