#javascript #file-upload #thumbnails #filepath #plupload
#javascript #загрузка файла #эскизы #путь к файлу #plupload
Вопрос:
Я использую plupload, чтобы позволить пользователям загружать изображения. Но я также хочу сгенерировать эскизы для предварительного просмотра, прежде чем они, наконец, решат сохранить его. Я понимаю, что в настоящее время функция «Предварительный просмотр изображения» отсутствует в plupload. Поэтому, чтобы обойти это, я решил отправить новую форму, содержащую только один файл для каждого добавленного изображения, и позволить серверу обработать его и вернуть эскиз.
Теперь мой вопрос в том, как мне получить дескриптор объекта file из plupload, чтобы я мог динамически создавать поле файла «input».
В настоящее время я перебираю uploader.files и устанавливаю input.name но я не знаю, как установить поле input.value, поскольку, похоже, я не могу получить полный путь к добавленному файлу.
Я готов к любым предложениям (в дополнение к полной замене этого подхода), мне просто нужен эскиз файла, выбранного для загрузки.
Ответ №1:
Возможно, мой ответ немного запоздал, но сегодня я искал похожее решение и придумал следующий подход. Это будет работать только со средой выполнения HTML5.
Поскольку нет способа получить файловые объекты из plupload, я изменил событие onchange динамически созданного поля ввода и сохранил файловые объекты для себя. Это делается путем привязки к PostInit-событию.
После этого я могу показать изображение пользователю с помощью FileReader API, представленного в HTML 5. Таким образом, нет необходимости отправлять изображение на сервер. Смотрите мой прослушиватель с добавлением файлов ниже.
// Currently added File Objects
var nativeFiles = {};
var uploader = new plupload.Uploader({
runtimes : 'html5,html4',
// Your settings...
});
uploader.bind('PostInit', function(up, params) {
// Initialize Preview.
if(uploader.runtime == "html5") {
var inputFile = document.getElementById(uploader.id '_html5');
var oldFunction = inputFile.onchange;
inputFile.onchange = function() {
nativeFiles = this.files;
oldFunction.call(inputFile);
}
}
});
uploader.bind('FilesAdded', function(up, files) {
for (var i in files) {
// Your code...
// Load Preview
if(uploader.runtime == "html5") {
var fileObject = uploader.getFile(files[i].id);
var reader = new FileReader();
reader.onload = (function(file, id) {
return function(e) {
var span = document.getElementById('thumb_' id);
span.innerHTML = "<img src='" e.target.result "'/>";
};
})(nativeFiles[i], files[i].id);
reader.readAsDataURL(nativeFiles[i]);
}
}
});
Комментарии:
1. Спасибо @dominik за ответ. На самом деле я пошел дальше и отправил файл, как только он был выбран, а затем полагался на серверный код для отправки эскиза обратно, а затем навсегда сохранил его в серверной части, как только пользователь будет удовлетворен им. Я знаю, что это может привести к ненужному использованию полосы пропускания, но это было единственное решение, совместимое с платформой, о котором я мог подумать.
2. зачем вам привязываться к событию изменения, если вы можете получить файловый объект через
FilesAdded
uploader.getFile(files[i].id)
?