当 <input type="file"> 在提交的表单上为空白时出错(Google 应用程序脚本)
Error when <input type="file"> is blank on a submitted form (Google App Script)
我正在创建一个 Google 网络应用程序(它是一个 HTML 表单),它将文件上传到我的云端硬盘上的文件夹。不需要上传文件,因此有时此输入实际上是 "blank"。该应用程序运行良好,除非您没有选择要上传的文件。它吐出这个错误:"Exception: We're sorry, a server error occurred. Please wait a bit and try again." 我有两个文件,html 文件和 .gs 文件。它们是:
/* The script is deployed as a web app and renders the form */
function doGet(e) {
return HtmlService.createHtmlOutputFromFile('FormFrontend.html');
}
/* This function will process the submitted form */
function uploadFiles(form) {
try {
/* Name of the Drive folder where the files should be saved */
var dropfolder = "Uploaded Files";
var folder, folders = DriveApp.getFoldersByName(dropfolder);
/* Find the folder, create the folder if it does not exist */
if (folders.hasNext()) {
folder = folders.next();
} else {
folder = DriveApp.createFolder(dropfolder);
}
/* Get the file uploaded though the form as a blob */
var blob = form.myFile;
var file = folder.createFile(blob);
var urlstr = file.getUrl()
/* Set the file description as the name of the uploader */
file.setDescription("Uploaded by " + form.ContactName);
/* Write response to spreadsheet */
var ss = SpreadsheetApp.openById("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
var responses = ss.getSheetByName("Responses");
responses.appendRow([form.CompanyName, form.ContactName, form.PhoneNumber, form.Email, form.Date, form.Severity, form.Details, urlstr])
/* As long as there's no errors you should se the below text */
return "Form Submitted Successfully "
} catch (error) {
/* If there's an error, show the error message */
return error.toString();
}
}
<html>
<body>
<!-- This is the actual HTML form -->
<div id="theform">
<form id="myForm">
<p style="font-size:30px">Customer Form</p>
Company Name:
<input type="text" name="CompanyName">
<br>Contact Name:
<input type="text" name="ContactName">
<br>Phone Number:
<input type="text" name="PhoneNumber">
<br>Contact Email:
<input type="email" name="Email">
<br>Date:
<input type="date" name="Date">
<br>Overall Severity: (1 Lowest, 5 Highest)
<br>
<input type="number" name="Severity" min="1" max="5" value="1">
<br>Details:
<br>
<textarea name="Details" rows=10 cols=65></textarea>
<br>
<br>Additional File (Optional):
<input type="file" name="myFile">
<br>
<!-- The submit button. It calls the server side function uploadFiles() on click -->
<input type="submit" value="Submit" onclick="this.value='Submitting..';
google.script.run.withSuccessHandler(fileUploaded)
.uploadFiles(this.parentNode);
return false;">
</form>
</div>
<!-- Here the results of the form submission will be displayed -->
<div id="output"></div>
</body>
</html>
<!-- The function will be called after the Google Script has executed -->
<script>
function fileUploaded(status) {
document.getElementById('myForm').style.display = 'none';
document.getElementById('output').innerHTML = status;
}
</script>
如果尝试在“/* 通过表单将文件作为 blob */”部分放置一个 IF 语句,告诉它如果 form.myFile 为空,则将 urlstr 设置为空,但是它仍然失败(但如果您选择一个实际文件,它仍然会成功完成)。我也无法在记录器中显示任何有用信息。
我是 Google App Script 的新手,如有任何帮助,我们将不胜感激!
我会检查实际上是什么 return 进入了变量 blob
。
var blob = form.myFile;
也许用JavaScripttypeOf
检查类型。
var whatsTheType = typeOf blob;
在这个测试函数中:
function testIt() {
var newTestFile = DriveApp.createFile('New Text File', 'Hello, world!');
var myBlob = newTestFile.getBlob();
var whatsTheType = typeof myBlob;
Logger.log('whatsTheType: ' + whatsTheType);
}
JavaScript typeof
return 作为 "object" 的 blob 类型。如果您检查 typeof
,它不是对象,则文件未上传。
放入 if
条件检查,而不是 "try/catch"。 "try/catch" 显然不能防止代码死亡。
if (whatsTheType === "object") {
//Create the file
var file = folder.createFile(blob);
};
或者,如果文件已上传,您应该能够检查文件选择器的 value
属性 是否为 return 名称。如果上传的文件没有名称,则用户没有使用文件选择器。
这就是最终的效果。 .getContentType 似乎总是 return "application/octet-stream" 当它留空并检查 returned 内容类型是否是特定的有效内容类型时。
/* Get the file uploaded though the form as a blob */
var blob = form.myFile;
var contentType = blob.getContentType();
if (contentType != "application/octet-stream") {
var file = folder.createFile(blob);
var urlstr = file.getUrl();
/* Set the file description as the name of the uploader */
file.setDescription("Uploaded by " + form.ContactName);
} else {
var urlStr = "None given";
}
我正在创建一个 Google 网络应用程序(它是一个 HTML 表单),它将文件上传到我的云端硬盘上的文件夹。不需要上传文件,因此有时此输入实际上是 "blank"。该应用程序运行良好,除非您没有选择要上传的文件。它吐出这个错误:"Exception: We're sorry, a server error occurred. Please wait a bit and try again." 我有两个文件,html 文件和 .gs 文件。它们是:
/* The script is deployed as a web app and renders the form */
function doGet(e) {
return HtmlService.createHtmlOutputFromFile('FormFrontend.html');
}
/* This function will process the submitted form */
function uploadFiles(form) {
try {
/* Name of the Drive folder where the files should be saved */
var dropfolder = "Uploaded Files";
var folder, folders = DriveApp.getFoldersByName(dropfolder);
/* Find the folder, create the folder if it does not exist */
if (folders.hasNext()) {
folder = folders.next();
} else {
folder = DriveApp.createFolder(dropfolder);
}
/* Get the file uploaded though the form as a blob */
var blob = form.myFile;
var file = folder.createFile(blob);
var urlstr = file.getUrl()
/* Set the file description as the name of the uploader */
file.setDescription("Uploaded by " + form.ContactName);
/* Write response to spreadsheet */
var ss = SpreadsheetApp.openById("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
var responses = ss.getSheetByName("Responses");
responses.appendRow([form.CompanyName, form.ContactName, form.PhoneNumber, form.Email, form.Date, form.Severity, form.Details, urlstr])
/* As long as there's no errors you should se the below text */
return "Form Submitted Successfully "
} catch (error) {
/* If there's an error, show the error message */
return error.toString();
}
}
<html>
<body>
<!-- This is the actual HTML form -->
<div id="theform">
<form id="myForm">
<p style="font-size:30px">Customer Form</p>
Company Name:
<input type="text" name="CompanyName">
<br>Contact Name:
<input type="text" name="ContactName">
<br>Phone Number:
<input type="text" name="PhoneNumber">
<br>Contact Email:
<input type="email" name="Email">
<br>Date:
<input type="date" name="Date">
<br>Overall Severity: (1 Lowest, 5 Highest)
<br>
<input type="number" name="Severity" min="1" max="5" value="1">
<br>Details:
<br>
<textarea name="Details" rows=10 cols=65></textarea>
<br>
<br>Additional File (Optional):
<input type="file" name="myFile">
<br>
<!-- The submit button. It calls the server side function uploadFiles() on click -->
<input type="submit" value="Submit" onclick="this.value='Submitting..';
google.script.run.withSuccessHandler(fileUploaded)
.uploadFiles(this.parentNode);
return false;">
</form>
</div>
<!-- Here the results of the form submission will be displayed -->
<div id="output"></div>
</body>
</html>
<!-- The function will be called after the Google Script has executed -->
<script>
function fileUploaded(status) {
document.getElementById('myForm').style.display = 'none';
document.getElementById('output').innerHTML = status;
}
</script>
如果尝试在“/* 通过表单将文件作为 blob */”部分放置一个 IF 语句,告诉它如果 form.myFile 为空,则将 urlstr 设置为空,但是它仍然失败(但如果您选择一个实际文件,它仍然会成功完成)。我也无法在记录器中显示任何有用信息。
我是 Google App Script 的新手,如有任何帮助,我们将不胜感激!
我会检查实际上是什么 return 进入了变量 blob
。
var blob = form.myFile;
也许用JavaScripttypeOf
检查类型。
var whatsTheType = typeOf blob;
在这个测试函数中:
function testIt() {
var newTestFile = DriveApp.createFile('New Text File', 'Hello, world!');
var myBlob = newTestFile.getBlob();
var whatsTheType = typeof myBlob;
Logger.log('whatsTheType: ' + whatsTheType);
}
JavaScript typeof
return 作为 "object" 的 blob 类型。如果您检查 typeof
,它不是对象,则文件未上传。
放入 if
条件检查,而不是 "try/catch"。 "try/catch" 显然不能防止代码死亡。
if (whatsTheType === "object") {
//Create the file
var file = folder.createFile(blob);
};
或者,如果文件已上传,您应该能够检查文件选择器的 value
属性 是否为 return 名称。如果上传的文件没有名称,则用户没有使用文件选择器。
这就是最终的效果。 .getContentType 似乎总是 return "application/octet-stream" 当它留空并检查 returned 内容类型是否是特定的有效内容类型时。
/* Get the file uploaded though the form as a blob */
var blob = form.myFile;
var contentType = blob.getContentType();
if (contentType != "application/octet-stream") {
var file = folder.createFile(blob);
var urlstr = file.getUrl();
/* Set the file description as the name of the uploader */
file.setDescription("Uploaded by " + form.ContactName);
} else {
var urlStr = "None given";
}