如何在 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不能用,请修改filesfile再测试

  • 并且,如果您的API需要为每个请求使用上传文件的唯一名称,请通过修改sample of [=17]来设置唯一名称=].

参考: