Может кто-нибудь объяснить, как реализовать плагин загрузки файла jQuery?
РЕДАКТИРОВАТЬ:
Кажется, это все равно, что я получаю трафик, поэтому я объясню, что я сделал. В итоге я получил плагин, работающий с помощью руководства Subrat, которое является принятым ответом. Тем не менее, загрузка файла jQuery – настоящая проблема, и если вы ищете простой плагин для загрузки файлов, я настоятельно рекомендую загрузить (спасибо, CORSAIR!). Как указывалось в ответе, он доступен только для некоммерческого использования.
Задний план
Я пытаюсь использовать jQuery для загрузки файла blueimp, чтобы пользователи могли загружать файлы. Из коробки он отлично работает , следуя инструкциям по установке. Но чтобы использовать его практически на моем веб-сайте, я хочу иметь возможность сделать пару вещей:
- Включите загрузчик на любую из моих существующих страниц.
- Изменение каталога для загруженных файлов
Все файлы для плагина расположены в папке под корнем.
- Проверка ввода массива с использованием модуля проверки правильности jquery
- Загрузка файла jQuery: возможно ли инициировать загрузку с помощью кнопки отправки?
- Как запустить jQuery Fancybox при загрузке страницы?
- Заполнитель HTML5 исчезает в фокусе
- Как отключить масштабирование колесика мыши с помощью API Карт Google
Я пробовал…
- Перемещение демонстрационной страницы в корневой каталог и обновление путей для необходимых сценариев
- Изменение параметров «upload_dir» и «upload_url» в файле UploadHandler.php, как предлагается здесь .
- Изменение URL во второй строке демонстрационного javascript
Во всех случаях отображается предварительный просмотр и выполняется индикатор выполнения, но файлы не загружаются, и я получаю эту ошибку в консоли: Uncaught TypeError: Cannot read property 'files' of undefined
. Я не понимаю, как работают все части плагина, которые затрудняют отладку.
Код
Javascript на демо-странице:
$(function () { 'use strict'; // Change this to the location of your server-side upload handler: var url = 'file_upload/server/php/UploadHandler.php', uploadButton = $('') .addClass('btn') .prop('disabled', true) .text('Processing...') .on('click', function () { var $this = $(this), data = $this.data(); $this .off('click') .text('Abort') .on('click', function () { $this.remove(); data.abort(); }); data.submit().always(function () { $this.remove(); }); }); $('#fileupload').fileupload({ url: url, dataType: 'json', autoUpload: false, acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i, maxFileSize: 5000000, // 5 MB // Enable image resizing, except for Android and Opera, // which actually support image resizing, but fail to // send Blob objects via XHR requests: disableImageResize: /Android(?!.*Chrome)|Opera/ .test(window.navigator.userAgent), previewMaxWidth: 100, previewMaxHeight: 100, previewCrop: true }).on('fileuploadadd', function (e, data) { data.context = $('').appendTo('#files'); $.each(data.files, function (index, file) { var node = $('') .append($('').text(file.name)); if (!index) { node .append('
') .append(uploadButton.clone(true).data(data)); } node.appendTo(data.context); }); }).on('fileuploadprocessalways', function (e, data) { var index = data.index, file = data.files[index], node = $(data.context.children()[index]); if (file.preview) { node .prepend('
') .prepend(file.preview); } if (file.error) { node .append('
') .append(file.error); } if (index + 1 === data.files.length) { data.context.find('button') .text('Upload') .prop('disabled', !!data.files.error); } }).on('fileuploadprogressall', function (e, data) { var progress = parseInt(data.loaded / data.total * 100, 10); $('#progress .bar').css( 'width', progress + '%' ); }).on('fileuploaddone', function (e, data) { $.each(data.result.files, function (index, file) { var link = $('') .attr('target', '_blank') .prop('href', file.url); $(data.context.children()[index]) .wrap(link); }); }).on('fileuploadfail', function (e, data) { $.each(data.result.files, function (index, file) { var error = $('').text(file.error); $(data.context.children()[index]) .append('
') .append(error); }); }).prop('disabled', !$.support.fileInput) .parent().addClass($.support.fileInput ? undefined : 'disabled'); });
Меня удивляет отсутствие документации; кажется, что это должно быть простое изменение. Я был бы признателен, если бы кто-нибудь мог объяснить, как это сделать.
- Удаленный модальный модуль Twitter загружает одно и то же содержимое каждый раз
- Есть ли полный рабочий пример для jqGrid ColumnChooser?
- Разбирайте RSS с помощью jQuery
- полный календарный выбор ячейки на мобильном устройстве?
- Установите ширину разделителя «Позиция: фиксированный» относительно родительского div
- Переопределить функцию jQuery .val ()?
- Firefox 4 Требуемая форма ввода RED border / outline
- Зачем возвращать this.each (function ()) в плагинах jQuery?
Несколько дней назад я искал аналогичную функциональность и наткнулся на хороший учебник по tutorialzine. Вот рабочий пример. Полный учебник можно найти здесь .
Простая форма для хранения диалога загрузки файлов:
И вот код jQuery для загрузки файлов:
$('#upload').fileupload({ // This function is called when a file is added to the queue add: function (e, data) { //This area will contain file list and progress information. var tpl = $(''+ ''+ ' ' ); // Append the file name and file size tpl.find('p').text(data.files[0].name) .append('' + formatFileSize(data.files[0].size) + ''); // Add the HTML to the UL element data.context = tpl.appendTo(ul); // Initialize the knob plugin. This part can be ignored, if you are showing progress in some other way. tpl.find('input').knob(); // Listen for clicks on the cancel icon tpl.find('span').click(function(){ if(tpl.hasClass('working')){ jqXHR.abort(); } tpl.fadeOut(function(){ tpl.remove(); }); }); // Automatically upload the file once it is added to the queue var jqXHR = data.submit(); }, progress: function(e, data){ // Calculate the completion percentage of the upload var progress = parseInt(data.loaded / data.total * 100, 10); // Update the hidden input field and trigger a change // so that the jQuery knob plugin knows to update the dial data.context.find('input').val(progress).change(); if(progress == 100){ data.context.removeClass('working'); } } }); //Helper function for calculation of progress function formatFileSize(bytes) { if (typeof bytes !== 'number') { return ''; } if (bytes >= 1000000000) { return (bytes / 1000000000).toFixed(2) + ' GB'; } if (bytes >= 1000000) { return (bytes / 1000000).toFixed(2) + ' MB'; } return (bytes / 1000).toFixed(2) + ' KB'; }
И вот пример кода PHP для обработки данных:
if($_POST) { $allowed = array('jpg', 'jpeg'); if(isset($_FILES['uploadctl']) && $_FILES['uploadctl']['error'] == 0){ $extension = pathinfo($_FILES['uploadctl']['name'], PATHINFO_EXTENSION); if(!in_array(strtolower($extension), $allowed)){ echo '{"status":"error"}'; exit; } if(move_uploaded_file($_FILES['uploadctl']['tmp_name'], "/yourpath/." . $extension)){ echo '{"status":"success"}'; exit; } echo '{"status":"error"}'; } exit(); }
Вышеприведенный код может быть добавлен в любую существующую форму. Эта программа автоматически загружает изображения после их добавления. Эта функция может быть изменена, и вы можете отправить изображение, пока вы отправляете свою существующую форму.
Обновлен мой ответ с фактическим кодом. Все кредиты оригинальному автору кода.
Источник: http://tutorialzine.com/2013/05/mini-ajax-file-upload-form/
Я только что провел 2 часа, сражаясь с загрузкой jQuery, но сдался из-за количества зависимостей (у меня было 13 JS-файлов, включенных, чтобы получить все колокола и свистки).
Я сделал немного больше поиска и наткнулся на опрятный проект под названием Dropzone.js , который не имеет никаких зависимостей.
Автор также создал демо-версию bootstrap, которая была вдохновлена плагином загрузки файлов jQuery.
Надеюсь, это поможет кому-то еще некоторое время.
Я также боролся с этим, но получил его работу, как только я понял, как пути работают в UploadHandler.php: upload_dir и upload_url, – это единственные настройки, на которые можно посмотреть, чтобы заставить его работать. Также проверьте свои журналы ошибок сервера для отладки информации.
Просмотрите загружаемый файл с drag and dropм изображения с предварительным просмотром изображения с помощью плагина jQuery.
HTML
![]()
JS
$(".target").dropper({ action: "upload.php", }).on("start.dropper", onStart); function onStart(e, files){ console.log(files[0]); image_preview(files[0].file).then(function(res){ $('.dropper-dropzone').empty(); //$('.dropper-dropzone').css("background-image",res.data); $('#imgPreview').remove(); $('.dropper-dropzone').append('
'); var widthImg=$('.dropper-dropzone').attr('width'); $('#imgPreview').attr({width:widthImg}); $('#imgPreview').attr({src:res.data}); }) } function image_preview(file){ var def = new $.Deferred(); var imgURL = ''; if (file.type.match('image.*')) { //create object url support var URL = window.URL || window.webkitURL; if (URL !== undefined) { imgURL = URL.createObjectURL(file); URL.revokeObjectURL(file); def.resolve({status: 200, message: 'OK', data:imgURL, error: {}}); } //file reader support else if(window.File && window.FileReader) { var reader = new FileReader(); reader.readAsDataURL(file); reader.onloadend = function () { imgURL = reader.result; def.resolve({status: 200, message: 'OK', data:imgURL, error: {}}); } } else { def.reject({status: 1001, message: 'File uploader not supported', data:imgURL, error: {}}); } } else def.reject({status: 1002, message: 'File type not supported', error: {}}); return def.promise(); } $('.dropper-dropzone').mouseenter(function() { $( '.dropper-dropzone>span' ).css("display", "block"); }); $('.dropper-dropzone').mouseleave(function() { $( '.dropper-dropzone>span' ).css("display", "none"); });
CSS
.dropper-dropzone{ width:78px; padding:3px; height:100px; position: relative; } .dropper-dropzone>img{ width:78px; height:100px; margin-top=0; } .dropper-dropzone>span { position: absolute; right: 10px; top: 20px; color:#ccc; } .dropper .dropper-dropzone{ padding:3px !important }
Демо-версия Jsfiddle
Это хорошо Угловой плагин для загрузки файлов, и его бесплатно!
загрузка углового файла
Некоторое время я боролся с этим плагином на Rails, а затем кто-то подсказал, что он переустанавливает весь код, который я создал.
Хотя похоже, что вы не используете это в Rails, однако, если кто-то использует его, проверьте этот gem . Источник находится здесь -> jQueryFileUpload Rails .
Обновить:
Чтобы удовлетворить комментатора, я обновил свой ответ. По существу « используйте этот камень , вот исходный код ». Если он исчезнет, сделайте это длинным путем.
Вы можете использовать uploadify, это лучший плагин jupery multiupload, который я использовал.
Реализация прост, поддержка браузера прекрасна.
Для плагина пользовательского интерфейса, с jsp-страницей и Spring MVC ..
Пример html . Нужно находиться в элементе формы с атрибутом id файловой загрузки
Образцы загрузки и удаления запросов
@PostMapping("/app/uploadResources") public @ResponseBody Map> uploadResources(MultipartHttpServletRequest request, Locale locale) { //https://github.com/jdmr/fileUpload/blob/master/src/main/java/org/davidmendoza/fileUpload/web/ImageController.java //https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#using-jquery-file-upload-ui-version-with-a-custom-server-side-upload-handler Map> response = new HashMap<>(); List fileList = new ArrayList<>(); String deleteUrlBase = request.getContextPath() + "/app/deleteResources.do?filename="; //http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/multipart/MultipartRequest.html Iterator itr = request.getFileNames(); while (itr.hasNext()) { String htmlParamName = itr.next(); MultipartFile file = request.getFile(htmlParamName); FileUploadResponse fileDetails = new FileUploadResponse(); String filename = file.getOriginalFilename(); fileDetails.setName(filename); fileDetails.setSize(file.getSize()); try { String message = saveFile(file); if (message != null) { String errorMessage = messageSource.getMessage(message, null, locale); fileDetails.setError(errorMessage); } else { //save successful String encodedFilename = URLEncoder.encode(filename, "UTF-8"); String deleteUrl = deleteUrlBase + encodedFilename; fileDetails.setDeleteUrl(deleteUrl); } } catch (IOException ex) { logger.error("Error", ex); fileDetails.setError(ex.getMessage()); } fileList.add(fileDetails); } response.put("files", fileList); return response; } @PostMapping("/app/deleteResources") public @ResponseBody Map>> deleteResources(@RequestParam("filename") List filenames) { Map>> response = new HashMap<>(); List
Пример classа для генерации требуемого json-ответа
public class FileUploadResponse { //https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#using-jquery-file-upload-ui-version-with-a-custom-server-side-upload-handler private String name; private long size; private String error; private String deleteType = "POST"; private String deleteUrl; /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the size */ public long getSize() { return size; } /** * @param size the size to set */ public void setSize(long size) { this.size = size; } /** * @return the error */ public String getError() { return error; } /** * @param error the error to set */ public void setError(String error) { this.error = error; } /** * @return the deleteType */ public String getDeleteType() { return deleteType; } /** * @param deleteType the deleteType to set */ public void setDeleteType(String deleteType) { this.deleteType = deleteType; } /** * @return the deleteUrl */ public String getDeleteUrl() { return deleteUrl; } /** * @param deleteUrl the deleteUrl to set */ public void setDeleteUrl(String deleteUrl) { this.deleteUrl = deleteUrl; } }
См. https://pitipata.blogspot.co.ke/2017/01/using-jquery-file-upload-ui.html.
Привет, попробуйте ссылку, это очень просто. Я застрял в течение долгого времени, и он решил мою проблему через несколько минут. http://simpleupload.michaelcbrook.com/#examples