Estou trabalhando em um plugin para o Obsidian e tenho batido a cabeça tentando fazer o upload de imagens. Eis o que tenho até agora:
async uploadImages(imageReferences: string[]): Promise<string[]> {
const imageUrls = [];
for (const ref of imageReferences) {
const filePath = this.app.metadataCache.getFirstLinkpathDest(ref, this.activeFile.name)?.path;
if (filePath) {
const file = this.app.vault.getAbstractFileByPath(filePath) as TFile;
if (file) {
try {
const arrayBuffer = await this.app.vault.readBinary(file);
const blob = new Blob([arrayBuffer]);
const boundary = '----WebKitFormBoundary7MA4YWxkTrZu0gW';
let body = '';
body += `--${boundary}\r\n`;
body += `Content-Disposition: form-data; name=\"type\"\r\n\r\n`;
body += "composer\r\n";
body += `--${boundary}\r\n`;
body += `Content-Disposition: form-data; name=\"synchronous\"\r\n\r\n`;
body += "true\r\n";
body += `--${boundary}\r\n`;
body += `Content-Disposition: form-data; name=\"files[]\"; filename=\"${file.name}\"\r\n`;
body += `Content-Type: image/jpg\r\n\r\n`
body += blob + '\r\n';
body += `--${boundary}--\r\n`;
console.log(body)
const formData = new TextEncoder().encode(body)
const url = `${this.settings.baseUrl}/uploads.json`;
const headers = {
"Api-Key": this.settings.apiKey,
"Api-Username": this.settings.disUser,
"Content-Type": `multipart/form-data; boundary=${boundary}`
};
const response = await requestUrl({
url: url,
method: "POST",
body: formData,
throw: false,
headers: headers,
});
//const response = await fetch(url, {
// method: "POST",
// body: formData,
// headers: new Headers(headers),
//});
console.log(`Upload Image response: ${response.status}`);
//if (response.ok) {
if (response.status == 200) {
const jsonResponse = response.json();
console.log(`Upload Image jsonResponse: ${JSON.stringify(jsonResponse)}`);
imageUrls.push(jsonResponse.url);
} else {
new NotifyUser(this.app, `Error uploading image: ${response.status}`).open();
console.error(`Error uploading image: ${JSON.stringify(response.json)}`);
//console.error("Error uploading image:", response.status, await response.text());
}
} catch (error) {
new NotifyUser(this.app, `Exception while uploading image: ${error}`).open();
console.error("Exception while uploading image:", error);
}
} else {
new NotifyUser(this.app, `File not found in vault: ${ref}`).open();
console.error(`File not found in vault: ${ref}`);
}
} else {
new NotifyUser(this.app, `Unable to resolve file path for: ${ref}`).open();
console.error(`Unable to resolve file path for: ${ref}`);
}
}
return imageUrls;
}
Estou construindo um multipart/form-data porque requestURL() não pode aceitar um formData() como parâmetro. Apenas string ou arrayBuffer. Não posso usar fetch() pois recebo um erro CORS. Com este código (e muitas pequenas alterações no body), estou recebendo o seguinte erro:
Error uploading image: {“errors”:[“You supplied invalid parameters to the request: Discourse::InvalidParameters”],“error_type”:“invalid_parameters”}
