簡體   English   中英

從外部 URL 獲取文件並使用 Apps 腳本上傳到 Google Drive

[英]Fetch file from external URL and upload to Google Drive using Apps Script

我不確定這是否可能。 我正在嘗試通過 google 表單中的插件獲取上傳到 formfacade 服務器的文件。 我正在使用它來允許其他非gmail用戶上傳文件而無需登錄。

我參考了 Mogsdad 和 dheeraj raj 在我可以從谷歌應用程序腳本生成的 URL 鏈接下載文件以使用 UrlFetchApp 來實現這一目標的答案。 以下是我的代碼:

方法一:

    function UrlFile2gdrive() {
     var sheet=SpreadsheetApp.getActiveSheet();
     var lrow=sheet.getLastRow();
     //var fileURL=sheet.getRange(lrow,2).getValue();
     var fileURL='https://formfacade.com/uploaded/1FAIpQLSfscYq_sbYcT2P3Sj3AvSD2zYKalIM0SKdPTESf1wE9Rq8qew/'
     +'97dc1ee0-f212-11ea-95c3-bdb6c5ab13b3/2124651919/A%20Sample%20PDF.pdf'
     var params = {method:"GET",headers:{"authorization":"Bearer "+ ScriptApp.getOAuthToken()}}; 
     
     var response=UrlFetchApp.fetch(fileURL,params);
      Logger.log(response.getContentText());
    var fileBlob=response.getBlob();
    
      
      var folder='0B2b-M7h6xF-Mflk3dGswano2TnJ3dGlmZG8wOUREMFg4blM5SHBuM3lqYmdPOThZSTBTSWs'
    
    
    var filename=fileURL.split("/").pop();
    //var filename=fileURL.split("%2F").pop();
    var file=decodeURIComponent(filename);
      Logger.log("filename : "+file);
      
     
     var newfile=DriveApp.getFolderById(folder).createFile(fileBlob.setName(file));    
     //var newfile=DriveApp.getFolderById(folder).createFile(response.setName(filename));
     
    }

方法二

    //api-key : AIzaSyCcbdBCI-Kgcz3tE1N4paeF9a-vdi3Uzz8
    
    //Declare function
    function URL2gdriveWithPswd() {
      //Getting url,existing name and new name for image from the sheet in 
      //variable url, name and new_name respectively
      var sh = SpreadsheetApp.getActiveSheet();
      var row = sh.getLastRow();
      Logger.log(row);
      //for (var i = 2; i <= row; i++) {
    
        /*var url = sh.getRange(i, 2).getValue();
        Logger.log(url);
        var name = sh.getRange(i, 3).getValue();
        var new_name = sh.getRange(i, 4).getValue();*/
      var url = sh.getRange(row, 2).getValue();
        Logger.log(url);
        var filenm=url.split("/").pop();
        var new_name=decodeURIComponent(filenm);
        var name = sh.getRange(row, 3).getValue();
        //var new_name = sh.getRange(row, 4).getValue();
        //Creating authentication token for downloading image, it may not be //required if image can be downloaded without login into
        var user = "dtestsys@gmail.com";
        var password = "1851235656";
        var headers = {
          "Accept": "application/xml",
          "Content-Type": "application/xml",
          "Authorization": "Basic " + Utilities.base64Encode(user + ":" + password)
        };
        //defining method to download file
        var options = {
          "method": "get",
          "headers": headers
        };
        //Getting folder name where to store downloaded image
        var folders = DriveApp.getFoldersByName('File Uploader (File responses)');
        while (folders.hasNext()) {
          var folder = folders.next();
          Logger.log(folder.getName());
        }
        //Getting response on hit of url using downloading method defined //earlier storing in Blob
        var response = UrlFetchApp.fetch(url, options).getBlob();
        //Creating image in folder defined with response in blob and logging same file //in log to check, if required
        var file = folder.createFile(response);
        Logger.log(file);
    
        //renaming image
        var images = folder.getFiles();
        while (images.hasNext()) {
          var image = images.next();
          
          file.setName(new_name);
          Logger.log("imagename : "+image.getName());
        }
      //}
    }

但是,這兩種方法都設法將文件放入我的 gdrive 中,但內容僅包含 html 代碼( https://drive.google.com/file/d/1NYQoMmCQEoP3z6L8niq1mpvIx7xl83zu/view?usp=sharing ),我認為是 URL在谷歌響應表中傳遞只是一個“面具”。 我注意到文件里面有一些提到 api-key 和 code 的行(在用戶電子郵件地址旁邊)。 有可能實現我的目標嗎? 這些 api-key 和代碼對於獲得授權訪問文件並將其下載到 gdrive 中是否有用?

我重新檢查了。生成並傳遞到我的谷歌表響應的鏈接只是重定向到另一個 XML 文件的登錄頁面。 當我在顯示原始文件內容后復制回最終 URL 時,URL 如下: https ://storage.googleapis.com/formfacade-public/1FAIpQLSfscYq_sbYcT2P3Sj3AvSD2zYKalIM0SKdPTESf1wE9Rq8qew%2F97dc1ee0-f212-11ea-95c3-bdb6c5ab13b3%2F212466 %20Sample%20PDF.pdf?GoogleAccessId=firebase-adminsdk-pve0p%40formfacade.iam.gserviceaccount.com&Expires=1599671507&Signature=fBzWej0fEgF6Aw7oCHX%2FTTUfHbcep%2Bj%2B%2FhB3fYFUDeq0SFTuyJ6jTnLWQJmldD6XkVug0%2BNki7ZPNo2ESufvIfQjhVLKXgvp7UiQheJ4GYL%2BtXgFLaUyglgemmfp7KSvIvPxpMcpC2lR8em3E5YIvMRr9tcfzagvusQYHEb9mlD7k833bVoqFUVWuP%2FkP8tl%2BHYVL15kSXAjtFif4QZpu%2FFHwSik89Keo78LKTm0U8hZiAMeYDQZWF6w1pcKpy04md3xKtDPwZYCoUWOOtKkCI6JLskE5HweDvMCGnDbxW8o6SWD%2BIC%2FlaNC6%2BJ81OB10cuRqwQPEc9LnfgCZK7b1A %3D%3D

當我粘貼上面的鏈接時,我看到了下面的截圖:- XML 文件格式外觀 . 所以,我猜他們不分享上傳文件的直接訪問鏈接,所以我們可以選擇購買/訂閱付費版本。

有誰知道我是否可以使用更好的替代方法來實現這一目標? 就像我在 @Tanaike 之前關於 Convert-API 的回答中學到的將 pdf 文件轉換為 PNG 的 API 密鑰鏈接一樣? 當然,它對免費版本有一些限制,但它仍然是一個非常有用的解決方案。

您沒有在任何地方分配 blob 的內容類型。 但是,如果您正確命名,則無關緊要。 在方法 1 中,當您應該在從 Blob 創建的文件上設置名稱時,您嘗試在 Blob 上設置名稱。

創建文件嘗試在文件上設置名稱。

例子:

function myFunction() {
  var url  ="http://www.africau.edu/images/default/sample.pdf";
  var response = UrlFetchApp.fetch(url);
  console.log(response.getResponseCode());
  var blob=response.getAs('application/pdf');
  var folder = "<SOME-FOLDER-ID>";
  var fileName=decodeURIComponent(url.split("/").pop());
  
  console.log("File named : "+fileName);
  var file=DriveApp.getFolderById(folder).createFile(blob);
  // Set the name to the created file after creating it!
  file.setName(fileName); 
}

有關參考,請參閱類File

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM