【问题标题】:Uploading files to pre-set Google Drive account using API? [closed]使用 API 将文件上传到预设的 Google Drive 帐户? [关闭]
【发布时间】:2018-10-16 18:25:45
【问题描述】:

我正在使用 Google Drive API 来访问和管理文件。但是,我希望将文件上传到预先设置的帐户中,并使用该帐户在内部存储 OAuth 凭据。

因此,我目前不确定如何在不通过我的服务器的情况下将文件上传到此帐户。有没有一种方法可以直接从客户的计算机将文件上传到 Google Drive 帐户,而不会暴露 OAuth 凭据或其他信息?

【问题讨论】:

    标签: javascript file google-apps-script web-applications google-drive-api


    【解决方案1】:

    我对你的问题的理解如下。

    • 您想让用户将文件上传到特殊帐户的 Google Drive。
    • 您想将凭据放在服务器端。

    如果我的理解是正确的,那么使用 Web Apps 怎么样? Web Apps 由 Google Apps 脚本作为服务器运行。我认为您可以通过使用它来实现您的情况。部署 Web 应用有以下 2 种模式。

    模式一:

    部署为“我”到“执行应用程序为:”和“任何人”到“谁有权访问应用程序:”。

    • 在此模式中,Web 应用程序的脚本作为帐户所有者运行。因此,在部署 Web 应用程序时,已经完成了上传授权。凭据位于服务器端。
    • 要求用户使用自己的访问令牌。此访问令牌用于访问 Web 应用程序。
    • Web Apps 的脚本需要与用户共享。

    我认为这种模式为上传提供了高安全性。但这样做是为了给用户带来任何负担。

    模式2:

    部署为“我”到“执行应用程序为:”和“任何人,甚至匿名”到“谁有权访问应用程序:”。

    • 在此模式中,Web 应用程序的脚本作为帐户所有者运行。因此,在部署 Web 应用程序时,已经完成了上传授权。凭据位于服务器端。
    • 用户无需访问令牌即可上传文件。
    • Web Apps 的脚本也不需要与用户共享。

    我认为在这种模式下,用户不需要使用访问令牌。例如,您可以将上传的密码设置为查询参数。而且这种模式可以在不给用户造成任何负担的情况下完成。

    注意:

    • 如果要使用上传密码作为查询参数,我推荐模式2。

    参考资料:

    如果我误解了你的问题,我很抱歉。

    编辑:

    此流程假设您可以使用 Google Apps 脚本并部署 Web 应用程序。它还假设 Web 应用程序部署为模式 2。此示例脚本用于使用浏览器上传文件。当然,您可以使用本地 PC 上传其他语言的文件。请将此视为示例。

    1. 复制并粘贴 GAS 的示例脚本。

    请将以下 GAS 脚本复制并粘贴到您的脚本编辑器中。

    function doPost(e) {
      var data = Utilities.base64Decode(e.parameters.data);
      var blob = Utilities.newBlob(data, e.parameters.mimetype, e.parameters.filename);
      DriveApp.createFile(blob);
      return ContentService.createTextOutput("Done.")
    }
    
    2. 部署 Web 应用程序。

    请像上面提到的模式 2 那样部署 Web 应用程序。部署 Web 应用程序时,可以检索 URL。这是终点。

    3.从本地PC上传文件

    您可以使用以下 HTML 上传文件。请在本地 PC 上使用它。并且在使用时请将https://script.google.com/macros/s/#####/exec修改为检索到的Web Apps的URL。

    <!DOCTYPE html>
    <html>
    
    <head>
        <title>Sample script for uploading file to Google Drive without authorization</title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.js"></script>
    </head>
    
    <body>
        <form action="https://script.google.com/macros/s/#####/exec" id="form" method="post">
            Upload a file
            <div id="data"></div>
            <input name="file" id="uploadfile" type="file">
            <input id="submit" type="submit">
        </form>
        <script>
        $('#uploadfile').on("change", function() {
            var file = this.files[0];
            var fr = new FileReader();
            fr.fileName = file.name;
            fr.onload = function(e) {
                e.target.result
                html = '<input type="hidden" name="data" value="' + e.target.result.replace(/^.*,/, '') + '" >';
                html += '<input type="hidden" name="mimetype" value="' + e.target.result.match(/^.*(?=;)/)[0] + '" >';
                html += '<input type="hidden" name="filename" value="' + e.target.fileName + '" >';
                $("#data").empty().append(html);
            }
            fr.readAsDataURL(file);
        });
        </script>
    </body>
    
    </html>
    

    参考:

    【讨论】:

    • 感谢您的回答。您能否就如何在 Google Apps 脚本中上传文件提供一些指导?谢谢。
    • @think123 我可以问一下您认为的指导吗?您可以运行 Google Apps 脚本吗?您可以部署 Web 应用程序吗?因为我不确定您从问题和评论中已经知道的信息。给您带来的不便,我深表歉意。
    • 我阅读了您链接的内容,这非常有帮助。但是,我不知道如何使用 Google Apps 脚本服务作为 POST 端点来上传文件。
    • @think123 感谢您的回复。我更新了我的答案。请确认。
    【解决方案2】:

    如果您可以让客户端登录到某种 oauth drive api 链接程序,您可以让客户端机器将其上传到他们自己的驱动器帐户并与您的谷歌帐户共享。在您的服务器上,它可能会检查驱动器的文件列表是否有更改,并创建任何新文件的副本。

    然后,您的服务器可以托管某种网页,其中包含它复制的所有文件的列表。客户端计算机会查看该网页,并将其上的文件从客户端计算机中删除,从而导致客户端驱动器帐户上没有存储空间,而您拥有自己的文件副本。

    【讨论】:

      猜你喜欢
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多