J'essaie d'utiliser un élément d'entrée de fichier pour télécharger plusieurs fichiers sur Drive à l'aide du formulaire html. Cela semble fonctionner uniquement pour un fichier, bien que le sélecteur de fichiers permette de sélectionner plusieurs fichiers. De retour dans la visionneuse du journal de script, je ne vois qu'un seul fichier capturé des deux que j'ai téléchargés. Est-ce non pris en charge ou est-ce que je vais dans le mauvais sens?
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>
Affichage du journal:
{"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}}
La sélection de plusieurs fichiers dans la boîte de dialogue lorsque vous cliquez sur le bouton Parcourir du champ Fichier se produit uniquement pour les nouveaux navigateurs prenant en charge HTML5 . Il ne permettra pas la sélection multiple pour les anciens navigateurs. Pour les navigateurs plus anciens, les seules bonnes solutions sont les plugins flash ou javascript. Voici une bonne ressource pour les uploaders jquery (certains supportent plusieurs fichiers): http://creativefan.com/10-ajax-jquery-file-uploaders/ . Par conséquent, ma suggestion est d'utiliser un plugin pour qu'il soit pris en charge sur les anciens ainsi que les nouveaux navigateurs.
J'utilise la possibilité d'envoyer un tableau de fichiers. Ajoutez simplement []
pour nommer un attribut:
<form action="/" enctype="multipart/form-data" method="post">
<input type="file" name="files[]" />
<input type="file" name="files[]" />
// etc.
<input type="submit">
</form>
Vous aurez un tableau de tableaux dans $_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
)
)
)
Bien sûr, vous devrez les télécharger un par un. Ne convient pas à un grand nombre de fichiers, mais fonctionne dans tous les navigateurs. Par exemple, en utilisant jQuery, vous pouvez ajouter une entrée de plus à chaque fois la dernière files[]
l'entrée a été modifiée.
function addOneMoreInput() {
$('input[type=file]').last().change(function() {
$(this).after('<input type="file" name="files[]" />');
$(this).off('change');
addOneMoreInput();
});
}
addOneMoreInput();
Vous pouvez utiliser HTML5 form-data & upload-multiple , veuillez vérifier ce lien: https://stackoverflow.com/a/20628748/1530842
Que diriez-vous de cet exemple de script?
Dans cet exemple, le flux suivant est exécuté.
Lorsque vous l'utilisez, copiez et collez le script Google Apps et le code HTML dans l'éditeur de script, puis exécutez le code HTML à l'aide de la boîte de dialogue, de la barre latérale et des applications Web.
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
peut être exécuté comme Web Apps et la barre latérale et la boîte de dialogue de Google Docs .