1つのファイル入力要素を使用して、htmlフォームを使用して複数のファイルをドライブにアップロードしようとしています。ファイルピッカーでは複数のファイルを選択できますが、これは1つのファイルに対してのみ機能するようです。スクリプトログビューアに戻ると、アップロードした2つのファイルのうちキャプチャされたファイルが1つしか表示されません。これはサポートされていないのですか、それとも間違っていますか?
Code.gs:
function logForm(form) {
Logger.log(JSON.stringify(form));
return true;
}
index.html:
<html>
<form id="uploadTest" enctype="multipart/form-data">
<input type="file" multiple="multiple" name="fileUpload">
<input type="button" id="upload" value="upload"
onclick="google.script.run.logForm(document.getElementById('uploadTest'));">
</form>
</html>
ログビュー:
{"fileUpload":{"contents":"GIF87a\u0001\u0000\u0001\u0000�
\u0000\u0000��̖��,\u0000\u0000\u0000\u0000\u0001\u0000
\u0001\u0000\u0000\u0002\u0002D\u0001\u0000;",
"type":"image/gif","name":"1x1.gif","length":35}}
ファイルフィールドの参照ボタンをクリックすると、ダイアログで複数ファイルが選択されますが、これは HTML5をサポートする新しいブラウザー に対してのみ発生します。古いブラウザの複数選択は許可されません。古いブラウザの場合、唯一の良い解決策はフラッシュまたはjavascriptプラグインです。 jqueryアップローダー(いくつかは複数のファイルをサポートしています)に適したリソースを次に示します。 http://creativefan.com/10-ajax-jquery-file-uploaders/ 。したがって、私の提案は、新しいブラウザだけでなく古いブラウザでもサポートされるように、いくつかのプラグインを使用することです。
ファイルの配列を送信する可能性を使用しています。 atrributeの名前に[]
を追加するだけです:
<form action="/" enctype="multipart/form-data" method="post">
<input type="file" name="files[]" />
<input type="file" name="files[]" />
// etc.
<input type="submit">
</form>
$_FILES
に配列の配列があります
Array
(
[files] => Array
(
[name] => Array
(
[0] => 1.png
[1] => 2.png
)
[type] => Array
(
[0] => image/png
[1] => image/png
)
[tmp_name] => Array
(
[0] => /tmp/phpDQOZWD
[1] => /tmp/phpCELeSw
)
[error] => Array
(
[0] => 0
[1] => 0
)
[size] => Array
(
[0] => 32209
[1] => 64109
)
)
)
もちろん、1つずつアップロードする必要があります。多数のファイルには便利ではありませんが、すべてのブラウザーで機能します。たとえば、jQueryを使用すると、最後のfiles[]
入力が変更されるたびにもう1つ入力を追加できます。
function addOneMoreInput() {
$('input[type=file]').last().change(function() {
$(this).after('<input type="file" name="files[]" />');
$(this).off('change');
addOneMoreInput();
});
}
addOneMoreInput();
HTML5form-data&upload-multipleを使用できます。このリンクを確認してください: https://stackoverflow.com/a/20628748/1530842
このサンプルスクリプトはどうですか?
このサンプルでは、次のフローが実行されます。
これを使用する場合は、Google AppsスクリプトとHTMLをスクリプトエディターにコピーして貼り付け、ダイアログ、サイドバー、Webアプリを使用してHTMLを実行してください。
function saveFile(obj) {
var blob = Utilities.newBlob(Utilities.base64Decode(obj.data), obj.mimeType, obj.fileName);
return DriveApp.createFile(blob).getId();
}
<input name="file" id="files" type="file" multiple>
<input type='button' value='Upload' onclick='getFiles()'>
<script>
function getFiles() {
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: f.files[i].name, mimeType: data[0].match(/:(\w.+);/)[1], data: data[1]};
google.script.run.withSuccessHandler((id) => {
console.log(id);
}).saveFile(obj);
}
fr.readAsDataURL(file);
});
}
</script>
index.html
は、 Webアプリ および Googleドキュメントのサイドバーとダイアログ として実行できます。