@Souvel1
Web-программист. Разрабатываю на WordPress.

Как формировать value для input[type=file]?

Задумка следующая, путем js, я делаю drag-drop файла, нескольких файлов, но как правильно в конечном итоге сформировать input[type=file], чтобы по сути js создавало лишь красивую обертку загрузку файлов, но никак не работало бы с backend'ом и на выходе получался обычный input с типом file *правда скрытый от глаз пользователя
<input name="file" type="file" multiple class="input-dropzone" data-dropzone-id="1" id="input-dropfile-1">

И если нужно уже сделанная логика JS с куском кода:
1) скрываем input по умолчанию
2) добавляем перед ним нашу форму
3) отлавливаем события перетаскивания на него файлов, либо по клику делаем, будто кликнули на данный input

var Dropfile = function (element, id, options) {
	var $el = $(element);

	// Скрываем input по умолчанию
	$el.css({
		'display': 'none'
	});

	// Добавляем поле, для перемещения файлов
	$el.before('<div class="dropfile-zone-wrap" id="dropfile-zone-wrap-'+id+'" data-dfz-id="'+id+'"><div class="dropfile-zone dfzt-open" id="dropfile-zone-'+id+'" data-dfz-id="'+id+'">'+options.placeholder+'</div></div>');

	// Добавляем событие на клик
	$('#dropfile-zone-'+id).bind('click', {thisId: id}, function(el) {
		$(options.baseFileID + el.data.thisId).trigger('click');
	});

	// Событие на перетаскивание файла
	$('#dropfile-zone-'+id)
	.bind('click', {thisId: id}, function(el) {
		$(options.baseFileID + el.data.thisId).trigger('click');
	})
	.bind('dragover', {thisId: id}, function(el) {
		$(this).addClass('drag-over');

		el.preventDefault();
		el.stopPropagation();
	})
	.bind('dragleave', {thisId: id}, function(el) {
		$(this).removeClass('drag-over');

		el.preventDefault();
		el.stopPropagation();
	})
	.bind('drop', {thisId: id}, function(el) {
		$(this).removeClass('drag-over');

		if ( ! el.originalEvent.dataTransfer ) return;
		if( ! el.originalEvent.dataTransfer.files.length ) return;

		el.preventDefault();
		el.stopPropagation();

		// На этом тормоз... Т.к. сперва нужно определить что должно быть на выходе
		console.log(el.originalEvent.dataTransfer.files);

	});
}
  • Вопрос задан
  • 2791 просмотр
Пригласить эксперта
Ответы на вопрос 1
neluzhin
@neluzhin
Вы не сможете изменить или задать атрибут value из соображений безопасности. По хорошему, вам надо сделать систему drag-n-drop так, чтобы данные при выборе файла вручную и данные при drag-n-drop'е хранились в одном месте (в скрытом div'е или может быть в какой-нибудь переменной), а затем уже AJAX-ом отправлять эти данные на сервер.

Настоятельно рекомендую ознакомиться с разжевыванием техники чтения локальных файлов и реализации функции drag-n-drop от Эрика Бидельмана: www.html5rocks.com/ru/tutorials/file/dndfiles/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы