#javascript #node.js #cloudinary
Вопрос:
Я пытаюсь загружать изображения с помощью прямого вызова API Cloudinary, который поставляется с преобразованиями. Прямо сейчас я могу загружать только те изображения, которые не имеют подобной трансформации:
...
const fileList = files;
const data = new FormData();
const { signature, timestamp } = await getSignature(); // Get returned sign and timestamp
data.append("file", fileList[0]);
data.append("signature", signature); // Signature
data.append("timestamp", timestamp); // Timestamp
data.append("api_key", process.env.NEXT_PUBLIC_CLOUDINARY_KEY);
const res = await fetch(
`https://api.cloudinary.com/v1_1/${process.env.NEXT_PUBLIC_CLOUDINARY_NAME}/image/upload`,
{
method: "POST",
body: data,
mode: "cors",
}
);
const file = await res.json();
...
Но на этот раз я пытаюсь загрузить изображение, содержащее водяной знак, по URL-адресу. Я попытался сделать что-то вроде:
const res = await fetch(
`https://api.cloudinary.com/v1_1/${process.env.NEXT_PUBLIC_CLOUDINARY_NAME}/image/upload/l_obra_watermark`,
{
method: "POST",
body: data,
mode: "cors",
}
);
Но это всегда приводит к ошибке CORS. Можно ли применить преобразование через URL-адрес? Как еще я мог бы это сделать?
Ответ №1:
Вы можете включить необходимые преобразования в предустановку загрузки и использовать эту предустановку загрузки в своем вызове загрузки следующим образом:
data.append(«upload_preset», my_preset);
Вы можете прочитать о предустановках загрузки здесь:
Ответ №2:
Я понял, что неправильно использовал синтаксис. Я узнал об этом, прочитав документы и применив их к своему собственному коду, и я понял, что должен был поместить преобразования внутри подписи следующим образом:
const cloudinaryHandler = async (
_req: NextApiRequest,
res: NextApiResponse
) => {
// Must be UNIX format
const timestamp = Math.round(new Date().getTime() / 1000);
// Signature
const signature = cloudinary.utils.api_sign_request(
{
timestamp: timestamp,
eager: "w_400,h_400,g_south_east,x_5,y_5,l_obra_watermark,o_76",
},
process.env.CLOUDINARY_SECRET //API Secret (MUST BE HIDDEN IN ENV)
);
res.statusCode = 200;
res.json({ signature, timestamp });
};
и не вошел data.append()
.
Вот документы, из которых я узнал об этом:
https://cloudinary.com/documentation/upload_images#manual_signature_generation