Как добавить ввод текста для загрузки dropzone
Я хочу разрешить пользователям отправлять заголовок для каждого файла, который перетаскивается в Dropzone, который будет введен в текстовый ввод. Но я не знаю, как его добавить. Все могут мне помочь?
![dropzone upload]()
Это мой html-код
<form id="my-awesome-dropzone" class="dropzone">
<div class="dropzone-previews"></div> <!-- this is were the previews should be shown. -->
<!-- Now setup your input fields -->
<input type="email" name="username" id="username" />
<input type="password" name="password" id="password" />
<button type="submit">Submit data and files!</button>
</form>
И это мой код script
<script>
Dropzone.options.myAwesomeDropzone = { // The camelized version of the ID of the form element
// The configuration we've talked about above
url: "upload.php",
autoProcessQueue: false,
uploadMultiple: true,
parallelUploads: 100,
maxFiles: 100,
maxFilesize:10,//MB
// The setting up of the dropzone
init: function() {
var myDropzone = this;
// First change the button to actually tell Dropzone to process the queue.
this.element.querySelector("button[type=submit]").addEventListener("click", function(e) {
// Make sure that the form isn't actually being sent.
e.preventDefault();
e.stopPropagation();
myDropzone.processQueue();
});
// Listen to the sendingmultiple event. In this case, it the sendingmultiple event instead
// of the sending event because uploadMultiple is set to true.
this.on("sendingmultiple", function() {
// Gets triggered when the form is actually being sent.
// Hide the success button or the complete form.
});
this.on("successmultiple", function(files, response) {
// Gets triggered when the files have successfully been sent.
// Redirect user or notify of success.
});
this.on("errormultiple", function(files, response) {
// Gets triggered when there was an error sending the files.
// Maybe show form again, and notify user of error
});
},
accept: function (file, done) {
//maybe do something here for showing a dialog or adding the fields to the preview?
},
addRemoveLinks: true
}
</script>
Ответы
Ответ 1
Фактически вы можете создать шаблон для Dropzone для рендеринга предварительного просмотра изображения и любых дополнительных полей. В вашем случае я бы предложил взять шаблон по умолчанию или сделать свой собственный и просто добавить туда поле ввода:
<div class="dz-preview dz-file-preview">
<div class="dz-image"><img data-dz-thumbnail /></div>
<div class="dz-details">
<div class="dz-size"><span data-dz-size></span></div>
<div class="dz-filename"><span data-dz-name></span></div>
</div>
<div class="dz-progress"><span class="dz-upload" data-dz-uploadprogress></span></div>
<div class="dz-error-message"><span data-dz-errormessage></span></div>
<input type="text" placeholder="Title">
</div>
Полный шаблон предварительного просмотра по умолчанию можно найти в исходном коде dropzone.js.
Затем вы можете просто передать свой настраиваемый шаблон Dropzone в виде строки для ключа PreviewTemplate параметров параметра. Например:
var myDropzone = new Dropzone('#yourId', {
previewTemplate: "..."
});
Пока ваш элемент является формой, Dropzone автоматически включает все входы в параметры запроса xhr.
Ответ 2
Я делаю что-то довольно похожее. Я достиг этого, просто добавив модальный диалог с jquery, который открывается при добавлении файла. Надеюсь, что это поможет.
this.on("addedfile", function() {
$("#dialog-form").dialog("open");
});
Ответ 3
Этот вид скрыт в документах, но место для добавления дополнительных данных находится в событии "отправка". Событие отправки вызывается непосредственно перед отправкой каждого файла и получает объект xhr и объекты formData как второй и третий параметры, поэтому вы можете их изменить.
Таким образом, в основном вы захотите добавить эти два дополнительных параметра, а затем добавить дополнительные данные в функцию "отправки" или в вашем случае "sendmultiple". Вы можете использовать jQuery или просто js для получения значений. Поэтому он должен выглядеть примерно так:
this.on("sendingmultiple", function(file, xhr, formData) {
//Add additional data to the upload
formData.append('username', $('#username').val());
formData.append('password', $('#password').val());
});
Ответ 4
В моем ответе замените поле "title" для моего поля описания.
Добавьте текст ввода или текстовое поле в шаблон предварительного просмотра. Например:
<div class="table table-striped files" id="previews">
<div id="template" class="file-row">
<!-- This is used as the file preview template -->
<div>
<span class="preview"><img data-dz-thumbnail /></span>
</div>
<div>
<p class="name" data-dz-name></p>
<input class="text" type="text" name="description" id="description" placeholder="Searchable Description">
</div> ... etc.
</div>
</div>
Затем в отправляющей функции добавьте связанные данные:
myDropzone.on("sending", function(file, xhr, formData) {
// Get and pass description field data
var str = file.previewElement.querySelector("#description").value;
formData.append("description", str);
...
});
Наконец, в обработке script, которая выполняет фактическую загрузку, получает данные из POST:
$description = (isset($_POST['description']) && ($_POST['description'] <> 'undefined')) ? $_POST['description'] : '';
Теперь вы можете сохранить свое описание (или название или что у вас есть) в базе данных и т.д.
Надеюсь, это сработает для вас. Это был сын-пушка, чтобы понять.
Ответ 5
Для тех, кто хочет сохранить автоматическое и отправить данные (например, ID или что-то, что не зависит от пользователя), вы можете просто добавить setTimeout в "добавленный файл":
myDropzone.on("addedfile", function(file) {
setTimeout(function(){
myDropzone.processQueue();
}, 10);
});
Ответ 6
Ну, я нашел решение для меня, и поэтому я собираюсь записать его в надежде, что это поможет другим людям. Основной подход состоит в том, чтобы иметь новый вход в контейнер предварительного просмотра и устанавливать его через класс css, если данные файла поступают с помощью последующего процесса загрузки или при инициализации из существующих файлов.
Вам нужно интегрировать следующий код в свой. Я просто пропустил некоторые строки, которые могут потребоваться, чтобы он работал.
photowolke = {
render_file:function(file)
{
caption = file.title == undefined ? "" : file.title;
file.previewElement.getElementsByClassName("title")[0].value = caption;
//change the name of the element even for sending with post later
file.previewElement.getElementsByClassName("title")[0].id = file.id + '_title';
file.previewElement.getElementsByClassName("title")[0].name = file.id + '_title';
},
init: function() {
$(document).ready(function() {
var previewNode = document.querySelector("#template");
previewNode.id = "";
var previewTemplate = previewNode.parentNode.innerHTML;
previewNode.parentNode.removeChild(previewNode);
photowolke.myDropzone = new Dropzone("div#files_upload", {
init: function() {
thisDropzone = this;
this.on("success", function(file, responseText) {
//just copy the title from the response of the server
file.title=responseText.photo_title;
//and call with the "new" file the renderer function
photowolke.render_file(file);
});
this.on("addedfile", function(file) {
photowolke.render_file(file);
});
},
previewTemplate: previewTemplate,
});
//this is for loading from a local json to show existing files
$.each(photowolke.arr_photos, function(key, value) {
var mockFile = {
name: value.name,
size: value.size,
title: value.title,
id: value.id,
owner_id: value.owner_id
};
photowolke.myDropzone.emit("addedfile", mockFile);
// And optionally show the thumbnail of the file:
photowolke.myDropzone.emit("thumbnail", mockFile, value.path);
// Make sure that there is no progress bar, etc...
photowolke.myDropzone.emit("complete", mockFile);
});
});
},
};
И есть мой шаблон для предварительного просмотра:
<div class="dropzone-previews" id="files_upload" name="files_upload">
<div id="template" class="file-row">
<!-- This is used as the file preview template -->
<div>
<span class="preview"><img data-dz-thumbnail width="150" /></span>
</div>
<div>
<input type="text" data-dz-title class="title" placeholder="title"/>
<p class="name" data-dz-name></p><p class="size" data-dz-size></p>
<strong class="error text-danger" data-dz-errormessage></strong>
</div>
<div>
<div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0">
<div class="progress-bar progress-bar-success" style="width:0%;" data-dz-uploadprogress></div>
</div>
</div>
</div>
Ответ 7
Вот мое решение:
Dropzone.autoDiscover = false;
var myDropzone = new Dropzone("#myDropzone", {
url: 'yourUploader.php',
init: function () {
this.on(
"addedfile", function(file) {
caption = file.caption == undefined ? "" : file.caption;
file._captionLabel = Dropzone.createElement("<p>File Info:</p>")
file._captionBox = Dropzone.createElement("<input id='"+file.filename+"' type='text' name='caption' value="+caption+" >");
file.previewElement.appendChild(file._captionLabel);
file.previewElement.appendChild(file._captionBox);
}),
this.on(
"sending", function(file, xhr, formData){
formData.append('yourPostName',file._captionBox.value);
})
}
});
yourUploader.php:
<?php
// Your Dropzone file named
$myfileinfo = $_POST['yourPostName'];
// And your files in $_FILES
?>