Обновление: Я создал проблему: https://issuetracker.google.com/issues/150675170
Мое веб-приложение долгое время работало хорошо, но теперь внезапно загруженные PDF-файлы повреждены , Ниже приведен небольшой уменьшенный пример, который можно использовать для воспроизведения проблемы.
Глядя на содержимое загруженного файла, выглядит, что содержимое файла обрабатывается как текст, а несколько символов заменяются на EF BF BD
, что является байтовой последовательностью UTF-8 для «ЗАМЕНА ХАРАКТЕРА» (U + FFFD).
Например, первые байты исходного файла PDF:
25 50 44 46 2D 31 2E 34 0A 25 E2 E3 CF D3 0A 31 39 | %PDF-1.4\n%âãÏÓ\n19
Он был загружен как:
25 50 44 46 2D 31 2E 34 0A 25 EF BF BD EF BF BD EF BF BD EF BF BD 0A 31 39 | %PDF-1.4\n%����\n19
Я не уверен, где сообщить об этом, я только надеюсь, что сотрудник Google увидит его и исправит.
Тем временем, возможно, у кого-то, кто знаком с Google Apps Script, есть идея обходного пути.
Ниже приведен небольшой сокращенный пример - разверните, загрузите двоичный файл, go на диск, найдите его в разделе «тест» », скачайте его, обратите внимание, что он поврежден.
HTML шаблон, имя файла test_form.html
:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<form id="test-form">
<input type="file" id="test-file" name="test-file">
<button id="submit-button" type="submit">Upload</button>
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
(function () {
'use strict';
$('#test-form').submit(function (e) {
e.preventDefault(); // prevent form from submitting
google.script.run
.withFailureHandler(fileUploadedFailure)
.withSuccessHandler(fileUploaded)
.uploadFilesFrame(this);
});
function fileUploaded(status) {
alert(status);
}
function fileUploadedFailure(error) {
alert('Failed: ' + error.message);
}
})();
</script>
</body>
</html>
Код сервера, имя файла Code.gs
:
var rootFolderName = "test";
function doGet(e) {
var template = HtmlService.createTemplateFromFile('test_form');
return template.evaluate().setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
function uploadFilesFrame(form) {
try {
var fileBlob = form['test-file'];
var rootFolder = DriveApp.getFoldersByName(rootFolderName);
if (rootFolder.hasNext()) {
rootFolder = rootFolder.next();
} else {
rootFolder = DriveApp.createFolder(rootFolderName);
}
var file = rootFolder.createFile(fileBlob);
return JSON.stringify({"status": 'ok', "msg": file.getId()});
} catch (error) {
return JSON.stringify({"status": 'error', "data": error.stack});
}
}