así que he estado tratando de entender algo con esto. hasta ahora podía publicar imágenes, pero ahora también me gustaría agregar archivos PDF. No entiendo si puedo simplemente agregar 'pdf' a mi tipo de contenido o si tengo que hacer otra configuración nueva.
import AWS from "aws-sdk"; const s3 = new AWS.S3({ accessKeyId: process.env.S3_ACCESS_KEY, secretAccessKey: process.env.S3_SECRET_KEY, }); const buildObject = (key: string, body: string) => { return { Bucket: process.env.S3_BUCKET_NAME, Key: `${key}`, Body: body, ACL: "public-read", ContentEncoding: "base64", ContentType: "image/jpeg", }; }; export const upload = (fileData: string, options = { type: null }) => { let { type = "image/png" } = options; if (fileData.includes("base64") || !options.type) type = "image/jpeg"; const file = `${new Date().getTime()}.${type.split("/")[1]}`; const object = buildObject(file, fileData); return new Promise((resolve, reject) => { s3.upload(object, (err, data) => { if (err) reject(err); else resolve(data.Location); }); }); };Creo que deberías usar el tipo de contenido: "aplicación/pdf".
Aconsejaría usar una lambda para imágenes y otra para pdf para darle una responsabilidad única.
Necesitarás un tipo de solicitud para imágenes y otro para pdf.
el resultado final después de muchos días de búsqueda, funcionó:
export const uploadFileForTechnialReport = async (req, res) => { const { file } = req.files; const { mimetype } = file; const allowedTypes = ["jpeg", "jpg", "pdf"]; try { if (!allowedTypes.some(type => mimetype.includes(type))) { return res.status(422).jsonp("Invalid format try with jpeg, jpg or PDF"); } let url; console.log("start uploading to s3"); switch (mimetype.split("/")[1]) { case "pdf": url = await uploadPDF(file.data); break; default: url = await upload(file.data); break; } console.log("upload to s3 done"); return res.status(200).send(url); } catch (err) { return res.status(400).send(`AN_ERROR_OCCURED_${err}`); } }; const s3 = new AWS.S3({ accessKeyId: process.env.S3_ACCESS_KEY, secretAccessKey: process.env.S3_SECRET_KEY, }); const buildObject = (key: string, body: string) => { return { Bucket: process.env.S3_BUCKET_NAME, Key: `${key}`, Body: body, ACL: "public-read", ContentEncoding: "base64", ContentType: "image/jpeg", }; }; export const upload = (fileData: string, options = { type: null }) => { let { type = "image/png" } = options; if (fileData.includes("base64") || !options.type) type = "image/jpeg"; const file = `${new Date().getTime()}.${type.split("/")[1]}`; const object = buildObject(file, fileData); return new Promise((resolve, reject) => { s3.upload(object, (err, data) => { if (err) reject(err); else resolve(data.Location); }); }); }; const buildObjectPDF = (key: string, body: string) => { return { Bucket: process.env.S3_BUCKET_NAME, Key: `${key}`, Body: body, ACL: "public-read", ContentEncoding: "base64", ContentType: "application/pdf", }; }; export const uploadPDF = async (fileData: string, options = { type: null }) => { const file = `${new Date().getTime()}.pdf`; const object = buildObjectPDF(file, fileData); const { Location } = await s3.upload(object).promise(); return Location; }; export const deleteFile = () => {};