2015-03-06 5 views
1

Я создаю приложение Google Web App (которое представляет собой HTML-форму), которое будет загружать файл в папку на моем диске , Не требуется, чтобы файл загружался, поэтому будут моменты, когда этот ввод будет по существу «пустым». Приложение работает отлично, за исключением случаев, когда вы не выбираете файл для загрузки. Он выплевывает эту ошибку: «Исключение: извините, произошла ошибка сервера. Подождите немного и повторите попытку». У меня есть два файла: html-файл и .gs-файл. Вот они:Ошибка, когда <input type = "file"> пуст в представленной форме (скрипт приложения Google)

/* 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>

Если бы попытался положить заявление, если вокруг «/ * Получить файл закачанный хотя форма как двоичных объектов * /» раздел, который говорит ему, чтобы просто установить urlstr ничто, если form.myFile пуст, но он все равно не работает (но если вы выберете фактический файл, он все равно успешно завершен). Я также не смог получить ничего полезного для показа в журнале.

Я довольно новичок в Google App Script, поэтому любая помощь будет оценена!

ответ

0

Это то, что в конечном итоге работает. Кажется, что .getContentType всегда возвращает «application/octet-stream», когда он оставлен пустым и проверяет, соответствует ли тип возвращаемого контента конкретному.

/* 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"; 
} 
+0

Я также хочу упомянуть об этом [post] (http://stackoverflow.com/questions/23244180/html-service-server-function-with-a-form), если у кого-то есть проблемы с представлением формы файла при установке LastPass в вашем браузере. Это была небольшая проблема, с которой я боролся. – kickehy

0

Я проверил бы, что действительно возвращается в переменную blob.

var blob = form.myFile; 

Возможно, проверьте этот тип с помощью JavaScript typeOf.

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 возвращает тип сгустка в качестве "объекта". Если вы проверите typeof, и это не объект, то файл не был загружен.

Вставьте if условный чек, а не «попробуйте/поймайте». Очевидно, что «попытка/уловка» не удерживает код от смерти.

if (whatsTheType === "object") { 
    //Create the file 
    var file = folder.createFile(blob); 
}; 

В качестве альтернативы, вы должны быть в состоянии проверить value свойства сборщика файла, чтобы вернуть имя, если файл был загружен. Если имя для загруженного файла отсутствует, пользователь не использует сборщик файлов.

+0

Извините за долгую задержку, поскольку в последнее время я был занят этим противным NAS. К сожалению, он возвращает тип в качестве объекта независимо от того, выбираете ли вы файл. – kickehy

+0

В итоге ваш пост заставил нас посмотреть класс блоба и в итоге найти то, что нам нужно, поэтому спасибо за вашу помощь! – kickehy

 Смежные вопросы

  • Нет связанных вопросов^_^