Я пытался создать компонент перетаскивания. У нас есть рабочий пример без использования формы или кнопки отправки (это делается при вводе пользователем или перетаскивании).
Я модифицирую компонент, чтобы он работал с оболочкой формы и отправлял данные в другая страница.
Вот js:
const $fileUploader = $('.fileUploader');
const $input = $fileUploader.find('input[type="file"]');
const $label = $fileUploader.find('label');
const showFiles = files => {
if (files) {
$label.text(files[0].name);
}
};
const uploadBulkReports = () => {
$input.on('change', e => {
showFiles(e.target.files);
});
$fileUploader
.on('drag dragstart dragend dragover dragenter dragleave drop', e => {
e.preventDefault();
e.stopPropagation();
})
.on('dragover dragenter', () => {
$fileUploader.addClass('is-dragover');
})
.on('dragleave dragend drop', () => {
$fileUploader.removeClass('is-dragover');
})
.on('drop', e => {
droppedFiles = e.originalEvent.dataTransfer.files;
$input.files = e.originalEvent.dataTransfer.files;
showFiles(droppedFiles);
});
};
uploadBulkReports();
Наш HTML (я упростил это из C # / Razor)
<form mvc-action="/BulkUpload/Brand" action="/BulkUpload/Brand" enctype="multipart/form-data">
<div class="fileUploader" data-action="/BulkUpload/Brand" data-method="post">
<div class="fileUploader__input">
<input class="fileUploader__file" type="file" name="file" id="file" accept=".csv" />
<label for="file">Click to select a file</label>
<p class="fileUploader__dragndrop"> or drag it here</p>
<ul class="small">
<li>Id: Technical id of the Brand (leave blank to create new)</li>
<li>Name: Name of the Brand</li>
</ul>
</div>
<a href="#" class="fileUploader__restart fa fa-redo-alt"></a>
<button class="btn btn-primary mt-2" type="submit">Submit</button>
</div>
</form>
Насколько я понимаю заключается в том, что при падении $input.files = e.originalEvent.dataTransfer.files;
должен установить значение входных файлов на информацию FileData, как и при выборе ввода. По какой-то причине он не работает при отправке.
Мы отправляем только один файл, поэтому я попытался получить доступ к файлу здесь e.originalEvent.dataTransfer.files[0];
, но похоже, что он не работает. (e.dataTransfer.files
у меня тоже не работает, пришлось пройти метод originalEvent
).
Я сделал этот jsfiddle https://jsfiddle.net/lharby/75m8ocva/ хотя не думаю, что это возможно для проверки отправки формы в jsfiddle.
Я хочу знать, идентична ли установка $input.files
для отброшенных файлов настройке ввода файла обычным методом. Когда я пытаюсь ввести console.log $input.files
после изменения ввода, я получаю undefined
, поэтому я предполагаю, что это другой метод.
Надеюсь, кто-то может помочь, если вам нужна дополнительная информация, дайте мне знать.