העלאת קבצים גדולים לגוגל דרייב API
-
@אביי זה חייב להיות דרך גוגל סקריפט? כי שם יש ככל הנראה מגבלת גודל כללית לבקשה יוצאת של 50MB.
אתה יכול להעלות דרך הAPI שלהם בnode.js, אני השתמשתי בעבר במדריך המעולה והברור הזה:
https://www.section.io/engineering-education/google-drive-api-nodejs
רק שים לב שבדרך ששם (הנפקת אישורים דרך הoauthplayground) האסימון רענון פוקע אחרי 7 ימים. אבל זה מסביר מצויין את שאר החלקים, וגם אתה יכול להתחיל ככה ובהמשך לעבור לאימות רגיל. -
@צדיק-תמים אמר בהעלאת קבצים גדולים לגוגל דרייב API:
@אביי זה חייב להיות דרך גוגל סקריפט?
די. אני יכול כמובן להעביר את זה לפלטפורמה אחרת, אבל זה מה שהכי התאים לי, בגלל שזה מתממשק ישר עם היישומים של גוגל וורקספייס.
-
@צדיק-תמים אמר בהעלאת קבצים גדולים לגוגל דרייב API:
@אביי מצאתי עכשיו ריפו שאמור לפתור בדיוק את הבעיה הזאת, תנסה לבדוק אותו
https://github.com/tanaikech/Resumable_Upload_For_WebAppsכיצד אני משתמש בזה כספרייה?
סורי, אני ממש בור בקטע הזה...
הריפו ש @צדיק-תמים הביא באמת עושה את העבודה, אבל הוא משרשר את הקובץ (והקוד) ע"י בחירת קובץ מהמחשב בדף html, אבל במקרה שלי מדובר בקבצי גוגל שיטס, שאני מקבל אותם לblub, אשמח אם מישהו יוכל להסביר לי איך להתאים את הריפו.זה הgs שמבצע את ההעלאה לאחר בחירת הקובץ
<script> const chunkSize = 5242880; $('#uploadfile').on("change", function() { var file = this.files[0]; if (file.name != "") { var fr = new FileReader(); fr.fileName = file.name; fr.fileSize = file.size; fr.fileType = file.type; fr.onload = init; fr.readAsArrayBuffer(file); } }); function init() { $("#progress").text("בהעלאה..."); var fileName = this.fileName; var fileSize = this.fileSize; var fileType = this.fileType; console.log({fileName: fileName, fileSize: fileSize, fileType: fileType}); var buf = this.result; var chunkpot = getChunkpot(chunkSize, fileSize); var uint8Array = new Uint8Array(buf); var chunks = chunkpot.chunks.map(function(e) { return { data: uint8Array.slice(e.startByte, e.endByte + 1), length: e.numByte, range: "bytes " + e.startByte + "-" + e.endByte + "/" + chunkpot.total, }; }); google.script.run.withSuccessHandler(function(at) { var xhr = new XMLHttpRequest(); xhr.open("POST", "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable"); xhr.setRequestHeader('Authorization', "Bearer " + at); xhr.setRequestHeader('Content-Type', "application/json"); xhr.send(JSON.stringify({ mimeType: fileType, name: fileName, })); xhr.onload = function() { doUpload({ location: xhr.getResponseHeader("location"), chunks: chunks, }); }; xhr.onerror = function() { console.log(xhr.response); }; }).getAt(); } function doUpload(e) { var chunks = e.chunks; var location = e.location; var cnt = 0; var end = chunks.length; var temp = function callback(cnt) { var e = chunks[cnt]; var xhr = new XMLHttpRequest(); xhr.open("PUT", location, true); xhr.setRequestHeader('Content-Range', e.range); xhr.send(e.data); xhr.onloadend = function() { var status = xhr.status; cnt += 1; console.log("Uploading: " + status + " (" + cnt + " / " + end + ")"); $("#progress").text("Uploading: " + Math.floor(100 * cnt / end) + "%"); if (status == 308) { callback(cnt); } else if (status == 200) { $("#progress").text("Done."); } else { $("#progress").text("Error: " + xhr.response); } }; }(cnt); } function getChunkpot(chunkSize, fileSize) { var chunkPot = {}; chunkPot.total = fileSize; chunkPot.chunks = []; if (fileSize > chunkSize) { var numE = chunkSize; var endS = function(f, n) { var c = f % n; if (c == 0) { return 0; } else { return c; } }(fileSize, numE); var repeat = Math.floor(fileSize / numE); for (var i = 0; i <= repeat; i++) { var startAddress = i * numE; var c = {}; c.startByte = startAddress; if (i < repeat) { c.endByte = startAddress + numE - 1; c.numByte = numE; chunkPot.chunks.push(c); } else if (i == repeat && endS > 0) { c.endByte = startAddress + endS - 1; c.numByte = endS; chunkPot.chunks.push(c); } } } else { var chunk = { startByte: 0, endByte: fileSize - 1, numByte: fileSize, }; chunkPot.chunks.push(chunk); } return chunkPot; } </script>