我正在使用皮纳塔,并试图将一些文件钉在ipfs上。这些文件来自用户输入,而不是从fs读取。具有以下代码:
export const deployFile = async (
file: Express.Multer.File,
httpService: HttpService,
): Promise => {
const formData = new FormData();
formData.append('file', Readable.from(file.buffer));
try {
const observable = httpService
.post(process.env.PINATA_BASE_URL + '/pinning/pinFileToIPFS', formData, {
headers: {
'Content-Type': `multipart/form-data; boundary=${formData.getBoundary()}`,
pinata_api_key: process.env.PINATA_API_KEY,
pinata_secret_api_key: process.env.PINATA_API_SECRET_KEY,
},
})
.pipe(map((response) => response.data));
const response = await lastValueFrom(observable);
return response.IpfsHash;
} catch (error) {
logger.error(`Error deploying image reason: ${error.response.data.error}`);
}总是命中错误Invalid request format.。如果使用以下方法从fs中读取文件,情况将如何:
const formData = new FormData();
formData.append('file', createReadStream(join(process.cwd(), '/images/1.jpeg')));一切正常工作,文件被成功地固定在Pinata上。所以我想:Readable.from(file.buffer)和createReadStream(join(process.cwd(), '/images/1.jpeg'))不同,知道如何将用户文件直接部署到ipfs,而不是从FS读取它们吗?
发布于 2022-08-30 18:35:48
如果您不想使用Pinata,那么从node.js方面来说这是一种简单的方法
async function storeImages(imagesDirPath) {
const fullImagesPath = path.resolve(imagesDirPath);
const files = fs.readdirSync(fullImagesPath);
let responses = [];
console.log("Uploading to Pinata !!!");
console.log("paths ", fs.createReadStream(fullImagesPath + "/" + files[0]));
for (fileIndex in files) {
const readableStreamForFile = fs.createReadStream(
`${fullImagesPath}/${files[fileIndex]}`
);
try {
const response = await pinata.pinFileToIPFS(readableStreamForFile);
responses.push(response);
} catch (error) {
console.log(error);
}
}
return { responses, files };
}
async function storeTokeUriMetadata(metadata) {
try {
const response = await pinata.pinJSONToIPFS(metadata);
return response;
} catch (error) {
console.log(error);
}
return null;
}祝好运
发布于 2022-10-13 00:48:20
下面是一个示例如何使用
const { Readable } = require("stream");
const FormData = require("form-data");
const axios = require("axios");
(async () => {
try {
const base64 = "BASE64 FILE STRING;
const imgBuffer = Buffer.from(base64, "base64");
const stream = Readable.from(imgBuffer);
const data = new FormData();
data.append('file', stream, {
filepath: 'FILENAME.png'
})
const res = await axios.post("https://api.pinata.cloud/pinning/pinFileToIPFS", data, {
maxBodyLength: "Infinity",
headers: {
'Content-Type': `multipart/form-data; boundary=${data._boundary}`,
pinata_api_key: pinataApiKey,
pinata_secret_api_key: pinataSecretApiKey
}
});
console.log(res.data);
} catch (error) {
console.log(error);
}
})();https://ethereum.stackexchange.com/questions/115498
复制相似问题