ПРЕДУПРЕЖДЕНИЕ: Это код совместимости для очень старых версий Safari и Chrome. Все современные браузеры поддерживают API FileReader; вот один урок: https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications
Этот код теперь полезен только в том случае, если по какой-то причине вам требуется поддержка Safari 5 и старше или Chrome 6 и старше.
Одной из возможностей является использование метода, используемого в SwellJS :
Используйте <input type="file" multiple="multiple" />
примерно так:
<form method="post" enctype="multipart/form-data" id="uploadform">
<input type="file" name="dragupload[]" multiple="multiple"
onchange="if (this.value) document.getElementById('uploadform').submit();" />
</form>
Элемент ввода может быть стилизован так, чтобы иметь opacity: 0
и располагаться (абсолютно) над элементом, который принимает загрузки. Вся форма может быть помещена в iframe
для "псевдо-Ajax" -подобного поведения. И элемент загрузки может быть скрытым слоем, пока что-то над ним не перетащено.
Такой iframe будет выглядеть так:
<script>
<!--
var entered = 0;
-->
</script>
<body ondragenter="entered++;document.getElementById('uploadelement').style.display='block'" ondragleave="entered--;if (!entered) document.getElementById('uploadelement').style.display='none'">
<form method="post" enctype="multipart/form-data" id="uploadform">
Things can be dragged and dropped here!
<input type="file" id="uploadelement" name="dragupload[]" multiple="multiple" onchange="if (this.value) { document.getElementById('uploadform').submit(); }" style="display:none;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;" />
</form>
</body>
Это следует делать только при обнаружении Safari или Chrome (поскольку другие браузеры не поддерживают перетаскивание на элементы <input type="file" />
) и может использоваться в сочетании с событием HTML5 drop
для Firefox 3.6 +.
Я не могу сказать, использует ли Gmail этот метод, но он, безусловно, работает также.