如何在 Apps 脚本中使用 Resmush.it API(多文件上传)
How to use Resmush.it API from Apps Script (multi files upload)
我正在尝试使用 Apps 脚本中的 resmush.it API,但在使用 UrlFetch
发出请求时遇到了困难。
根据他们的 documentation,我了解到他们在 multipart/form-data 请求中需要一个文件数组。
目前我在做什么(图片来自 Google 幻灯片)
function myFunction() {
const OPTIMIZER_URL = "http://api.resmush.it/ws.php"
let slides = SlidesApp.openById("1TUZSgG_XXX_ni6VhdbE5usRyMc");
let pages = slides.getSlides();
pages.forEach((page) => {
let images = page.getImages();
images.forEach(image => {
let payload = {
files: [{
file: image.getBlob()
}]
}
let options = {
method: "POST",
payload: payload,
muteHttpExceptions : true
}
let response = UrlFetchApp.fetch(OPTIMIZER_URL, options)
let jsonResponse = JSON.parse(response.getContentText())
console.log(jsonResponse);
})
})
}
我也试过 payload = { file: image.getBlob() }
但没有成功。
我每次都会收到这个错误:
{ error: 400,
error_long: 'No file or url provided',
generator: 'reSmush.it rev.3.0.4.20210124' }
你能看出哪里出了问题吗?
谢谢
虽然我不确定从你提供的文件中我是否能正确理解你想使用的API的规范,但是下面修改的脚本怎么样?
当我看到你的剧本时,我担心你的image.getBlob()
没有名字。在这种情况下,数据不会作为文件发送。我认为这可能是您遇到问题的原因。当我的这个猜测反映到你的脚本中时,就变成了这样。
修改后的脚本:
function myFunction() {
const OPTIMIZER_URL = "http://api.resmush.it/ws.php"
let slides = SlidesApp.openById("1TUZSgG_XXX_ni6VhdbE5usRyMc");
let pages = slides.getSlides();
pages.forEach((page) => {
let images = page.getImages();
images.forEach(image => {
let options = {
method: "POST",
payload: { files: image.getBlob().setName("sample") },
muteHttpExceptions: true
}
let response = UrlFetchApp.fetch(OPTIMIZER_URL, options)
console.log(response.getContentText());
})
})
}
本次修改,请求体使用{ files: image.getBlob().setName("sample") }
。我不确定您要使用的 API 的详细规格。所以,如果files
的key不能用,请修改files
为file
再测试
并且,如果您的API需要为每个请求使用上传文件的唯一名称,请通过修改sample
of [=17]来设置唯一名称=].
参考:
我正在尝试使用 Apps 脚本中的 resmush.it API,但在使用 UrlFetch
发出请求时遇到了困难。
根据他们的 documentation,我了解到他们在 multipart/form-data 请求中需要一个文件数组。
目前我在做什么(图片来自 Google 幻灯片)
function myFunction() {
const OPTIMIZER_URL = "http://api.resmush.it/ws.php"
let slides = SlidesApp.openById("1TUZSgG_XXX_ni6VhdbE5usRyMc");
let pages = slides.getSlides();
pages.forEach((page) => {
let images = page.getImages();
images.forEach(image => {
let payload = {
files: [{
file: image.getBlob()
}]
}
let options = {
method: "POST",
payload: payload,
muteHttpExceptions : true
}
let response = UrlFetchApp.fetch(OPTIMIZER_URL, options)
let jsonResponse = JSON.parse(response.getContentText())
console.log(jsonResponse);
})
})
}
我也试过 payload = { file: image.getBlob() }
但没有成功。
我每次都会收到这个错误:
{ error: 400,
error_long: 'No file or url provided',
generator: 'reSmush.it rev.3.0.4.20210124' }
你能看出哪里出了问题吗?
谢谢
虽然我不确定从你提供的文件中我是否能正确理解你想使用的API的规范,但是下面修改的脚本怎么样?
当我看到你的剧本时,我担心你的image.getBlob()
没有名字。在这种情况下,数据不会作为文件发送。我认为这可能是您遇到问题的原因。当我的这个猜测反映到你的脚本中时,就变成了这样。
修改后的脚本:
function myFunction() {
const OPTIMIZER_URL = "http://api.resmush.it/ws.php"
let slides = SlidesApp.openById("1TUZSgG_XXX_ni6VhdbE5usRyMc");
let pages = slides.getSlides();
pages.forEach((page) => {
let images = page.getImages();
images.forEach(image => {
let options = {
method: "POST",
payload: { files: image.getBlob().setName("sample") },
muteHttpExceptions: true
}
let response = UrlFetchApp.fetch(OPTIMIZER_URL, options)
console.log(response.getContentText());
})
})
}
本次修改,请求体使用
{ files: image.getBlob().setName("sample") }
。我不确定您要使用的 API 的详细规格。所以,如果files
的key不能用,请修改files
为file
再测试并且,如果您的API需要为每个请求使用上传文件的唯一名称,请通过修改
sample
of [=17]来设置唯一名称=].