gpt4 book ai didi

javascript - 通过一次表单提交将多个文件上传到一个文件夹中

转载 作者:行者123 更新时间:2023-11-30 19:38:52 24 4
gpt4 key购买 nike

我创建了一个自定义 Google 表单,允许登录的 Google 用户在表单中包含多个文件。这些文件将上传到 Google Drive 中新创建的文件夹中。Google 脚本使用当前用户的电子邮件地址 + 当前日期和时间作为文件夹名称。

问题及预期结果:

由于 forEach 函数,脚本将每个文件上传到一个单独的文件夹(具有相同的名称)。我想将一个 表单提交的每个文件上传到一个 文件夹。

HTML:

<iframe name="hidden_iframe" id="hidden_iframe" style="display:none;" onload="if(submitted)  { picUploadJs(myForm); }"></iframe>
<form id="myForm" class="col s12" action="https://docs.google.com/forms/d/e/xxx/formResponse" target="hidden_iframe" onsubmit="submitted=true;">
<input placeholder="1234" name="entry.1234" id="user" type="text">
<label for="user">User:</label>
<input name="picToLoad" type="file" id="sampleFile" />
<div id="status" style="display: none">
Uploading. Please wait...
</div>
<button type="submit" name="action">Send</button> <!-- Modified -->
</form>

Javascript:

 function picUploadJs(myForm) {
const f = document.getElementById("files");
[...f.files].forEach((file, i) => {
const fr = new FileReader();
fr.onload = (e) => {
const data = e.target.result.split(",");
const obj = {fileName: file.name, mimeType: data[0].match(/:(\w.+);/)[1], data: data[1]};
document.getElementById('status').style.display = 'inline';
google.script.run.withSuccessHandler(updateOutput).processForm(obj);
}
fr.readAsDataURL(file);
});
}

function updateOutput() {
var outputDiv = document.getElementById('status');
outputDiv.innerHTML = "The File was UPLOADED!";
window.location='https://Thankyou';
}

谷歌脚本:

function doGet(e) {
Logger.log("doGet done");
return HtmlService.createTemplateFromFile('test')
.evaluate() // evaluate MUST come before setting the Sandbox mode
.setTitle('Form')
//.setSandboxMode();//Defaults to IFRAME which is now the only mode available
}

function processForm(theForm) {
var dateTime = Utilities.formatDate(new Date(), "GMT+2", "dd-MM-yy_HH-mm");
var email = Session.getActiveUser().getEmail();
var parentFolder=DriveApp.getFolderById('xxxxx');
var newFolder=parentFolder.createFolder(email + "_" + dateTime);
var newFolderId = DriveApp.getFoldersByName(newFolder).next().getId();

var fileBlob = Utilities.newBlob(Utilities.base64Decode(theForm.data), theForm.mimeType, theForm.fileName);
var fldrSssn = DriveApp.getFolderById(newFolderId);
fldrSssn.createFile(fileBlob);
return true;
}

最佳答案

  • 提交文件时,您希望每次提交都创建一个新文件夹。
  • 您想将多个文件上传到创建的文件夹。

如果我的理解是正确的,这个修改怎么样?请将此视为几个答案之一。

修改后的脚本:

HTML:

请修改如下。

从:
<input name="picToLoad" type="file" id="sampleFile" />
到:
<input name="picToLoad" type="file" id="files" multiple />

Javascript:

请修改picUploadJs()

function picUploadJs(myForm) {
const f = document.getElementById("files");
google.script.run.withSuccessHandler((folderId) => { // Added
var files = [...f.files];
files.forEach((file, i) => {
const fr = new FileReader();
fr.onload = (e) => {
const data = e.target.result.split(",");
const obj = {fileName: file.name, mimeType: data[0].match(/:(\w.+);/)[1], data: data[1]};
document.getElementById('status').style.display = 'inline';
google.script.run.withSuccessHandler(() => {
if (i == files.length - 1) updateOutput();
}).processForm(obj, folderId); // Modified
}
fr.readAsDataURL(file);
});
}).createFolder();
}

Google Apps 脚本:

我将 processForm() 分离为 processForm()createFolder()

// Added
function createFolder() {
var dateTime = Utilities.formatDate(new Date(), "GMT+2", "dd-MM-yy_HH-mm");
var email = Session.getActiveUser().getEmail();
var parentFolder = DriveApp.getFolderById('xxxxx');
var newFolder = parentFolder.createFolder(email + "_" + dateTime);
var newFolderId = DriveApp.getFoldersByName(newFolder).next().getId();
return newFolderId;
}

// Modified
function processForm(theForm, newFolderId) {
var fileBlob = Utilities.newBlob(Utilities.base64Decode(theForm.data), theForm.mimeType, theForm.fileName);
var fldrSssn = DriveApp.getFolderById(newFolderId);
fldrSssn.createFile(fileBlob);
return true;
}

注意事项:

  • 在您的 HTML 中,顶行如下所示。

    <form id="myForm" target="hidden_iframe" onsubmit="submitted=true;">

    来自 your previous question ,如果您使用以下几行,请更新您的问题。我假设您正在使用以下脚本。

    <iframe name="hidden_iframe" id="hidden_iframe" style="display:none;" onload="if(submitted)  { picUploadJs(myForm); }"></iframe>
    <form id="myForm" action="https://docs.google.com/forms/d/e/xxx/formResponse" target="hidden_iframe" onsubmit="submitted=true;">

如果这不是您想要的结果,我深表歉意。

关于javascript - 通过一次表单提交将多个文件上传到一个文件夹中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55626979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com