【问题标题】:Upload file to Google Drive with React and Google App script使用 React 和 Google App 脚本将文件上传到 Google Drive
【发布时间】:2019-11-23 05:07:20
【问题描述】:

我正在尝试使用 Google App 脚本和 React 上传文件。

谷歌脚本:

function uploadArquivoParaDrive(base64Data, nomeArq, idPasta) {
  try{
    var splitBase = base64Data.split(','),
    type = splitBase[0].split(';')[0].replace('data:','');

    var byteCharacters = Utilities.base64Decode(splitBase[1]);
    var ss = Utilities.newBlob(byteCharacters, type);
    ss.setName(nomeArq);

    var file = DriveApp.getFolderById(idPasta).createFile(ss);

    return file.getName();
  }catch(e){
    return 'Erro: ' + e.toString();
  }
}

我可以运行这个蚂蚁,它可以工作:

function uploadFile() {
  var image =   UrlFetchApp.fetch('url to some image').getBlob();
  var file = {
    title: 'google_logo.png',
    mimeType: 'image/png'
  };
  file = Drive.Files.insert(file, image);
  Logger.log('ID: %s, File size (bytes): %s', file.id, file.fileSize);
}

这是 React 脚本:

onSubmit = (e) => {
    e.preventDefault();

    axios.get(url, {...this.state}, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
    }, (response) => {
        console.log(response);
    })

};

 setFile = (event) => {
    console.log(event.target.files)
     this.setState({file: event.target.files[0]});
};

render() {

    return (
        <form>
            <input type="file" id="file" onChange={this.setFile} />
            <button onClick={this.onSubmit}>ADD</button>
        </form>
    )
}

我正在尝试使用 POST,但我收到了 400 个响应。我知道这不可能是 GET 请求,但是有了它,我得到了 - 200 没有响应。

我可以在工作表中插入行,但我想使用 Google App Scripts 将文件上传到 Google 云端硬盘。

我知道有一种方法可以通过 Google Scripts 和 React 上传文件,因为有一种方法可以不使用 React (google.script.run)。

【问题讨论】:

  • 服务器接收脚本doPost()在哪里?
  • 您好,但是如何将请求连同文件一起发送到doPost()
  • 首先,您的 POST 接收器在哪里?应该有一个 doPost() 函数服务器端来接收文件。它在哪里?其次,我不认为multipart/form-data 与文件一起使用,您需要将其作为application/x-www-form-urlencoded 发送,或者多部分数据标题中的文件部分不应该有filename:,这样数据就不会被解释为文件服务器端,但作为 blob 数据

标签: javascript reactjs google-apps-script


【解决方案1】:

这里有两种在混合模式下使用的不同方法。在某些情况下这是不可接受的。

让我们轻声说“React 是一个假人”。这是一个附加组件,当涉及到您所依赖的某些东西时,您应该始终避免使用它,但您无法更改。看看SOLID 是什么。

以下始终假定您在浏览器中工作。您的网页托管在 Google Apps 脚本的网络应用程序中。

第一种方法。使用 XMLHttpRequests

在客户端,您必须使用浏览器中的 XMLHttpRequests 调用。

在服务器端,您必须使用 doGet doPost 保留功能。始终以清晰简单的格式传输数据。这将节省查找错误的时间。

例如https://stackoverflow.com/a/11300412/1393023

第二种方法。使用客户端 API

在客户端,您必须使用浏览器中的google.script.run 调用。

在服务器端,您必须使用您的功能。始终以清晰简单的格式传输数据。这将节省查找错误的时间。

例如https://stackoverflow.com/a/15790713/1393023

后果

您的示例有混合方法的迹象。不幸的是,它无法快速调试。

React 没有理由导致问题。如果是这样,那么您的架构不正确。

如果你想使用axios,那么你需要考虑第一种方法。

如果你想使用google.script.run那么你需要捕获onSubmit然后你需要调用一个实现google.script.run的接口。通常是异步的,因为最后一次调用仍然会通过回调完成。

【讨论】:

  • 谢谢答案,但我需要使用 React。您使用按钮和内联功能的解决方案是一种处理方式,可以实现,但会有点复杂,因为还有另一个数据+文件上传,我需要立即处理。第一种方法将是最好的方法将是最好的。可能需要以某种方式实现 Google API JS 库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
  • 1970-01-01
相关资源
最近更新 更多