Я хотел бы загрузить файл асинхронно с JQuery.
$(document).ready(function () {
$("#uploadbutton").click(function () {
var filename = $("#file").val();
$.ajax({
type: "POST",
url: "addFile.do",
enctype: 'multipart/form-data',
data: {
file: filename
},
success: function () {
alert("Data Uploaded: ");
}
});
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<span>File</span>
<input type="file" id="file" name="file" size="10"/>
<input id="uploadbutton" type="button" value="Upload"/>
Вместо загружаемого файла я получаю только имя файла. Что я могу сделать, чтобы решить эту проблему?
javascript
jquery
ajax
asynchronous
xmlhttprequest
Серхио дель Амо
источник
источник
Ответы:
С HTML5 вы можете загружать файлы с помощью Ajax и jQuery. Мало того, вы можете выполнять проверку файлов (имя, размер и тип MIME) или обрабатывать событие progress с помощью тега прогресса HTML5 (или div). Недавно мне пришлось сделать загрузчик файлов, но я не хотел использовать Flash, ни Iframes, ни плагины, и после некоторых исследований я нашел решение.
HTML:
Во-первых, вы можете сделать некоторую проверку, если хотите. Например, в
.on('change')
случае файла:Теперь
$.ajax()
отправьте с нажатием кнопки:Как вы можете видеть, с HTML5 (и некоторыми исследованиями) загрузка файлов не только становится возможной, но и очень простой. Попробуйте это с Google Chrome, так как некоторые компоненты примеров HTML5 доступны не во всех браузерах.
источник
name="file"
это очень важно<input>
для тега file, если вы собираетесь использовать данные в PHP (и, возможно, в других местах). Я создал форму динамически, используя javascript, поэтому мне не понадобился атрибут name, но я выяснил, каким сложным образом он вам нужен для получения данных на стороне сервера.Обновление 2019 года: все еще зависит от браузеров, которые вы используете.
С «новым» HTML5
file
API важно понять, что он не поддерживается до IE 10 . Если конкретный рынок, на который вы ориентируетесь, имеет склонность выше средних к старым версиям Windows, у вас может не быть к нему доступа.По состоянию на 2017 год около 5% браузеров - это IE 6, 7, 8 или 9. Если вы идете в большую корпорацию (например, это инструмент B2B или то, что вы предоставляете для обучения), это число может взлететь , В 2016 году я имел дело с компанией, использующей IE8, на более чем 60% своих машин.
Сейчас 2019 год, почти 11 лет после моего первоначального ответа. IE9 и ниже глобально около отметки 1%, но все еще есть кластеры более высокого использования.
Важным выводом из этого - какой бы ни была функция - является проверка того , какой браузер используют ваши пользователи . Если вы этого не сделаете, вы извлечете быстрый и мучительный урок о том, почему «работает для меня» недостаточно хорошо в доставке клиенту. могу ли я использовать - полезный инструмент, но обратите внимание, откуда они свою демографию. Они могут не совпадать с вашими. Это никогда не является правдой, чем корпоративная среда.
Мой ответ от 2008 года следует.
Однако существуют жизнеспособные не-JS методы загрузки файлов. Вы можете создать на странице iframe (который вы скрываете с помощью CSS), а затем настроить таргетинг своей формы для публикации в этом iframe. Главная страница не должна двигаться.
Это «настоящий» пост, поэтому он не совсем интерактивный. Если вам нужен статус, вам нужно что-то на стороне сервера для обработки этого. Это сильно зависит от вашего сервера. ASP.NET имеет более приятные механизмы. PHP не работает, но вы можете использовать Perl модификации или Apache, чтобы обойти это.
Если вам нужно несколько загрузок файлов, лучше делать каждый файл по одному (чтобы преодолеть максимальные ограничения на загрузку файлов). Отправьте первую форму в iframe, следите за ее продвижением, используя приведенное выше, и после ее завершения отправьте вторую форму в iframe и т. Д.
Или используйте решение Java / Flash. Они намного более гибки в том, что они могут делать со своими постами ...
источник
Я рекомендую использовать плагин Fine Uploader для этой цели. Ваш
JavaScript
код будет:источник
Примечание. Этот ответ устарел, теперь можно загружать файлы с помощью XHR.
Вы не можете загружать файлы, используя XMLHttpRequest (Ajax). Вы можете смоделировать эффект, используя iframe или Flash. Отличный плагин jQuery Form, который отправляет ваши файлы через iframe, чтобы получить эффект.
источник
Подведение итогов для будущих читателей.
Асинхронная загрузка файлов
С HTML5
Вы можете загружать файлы с помощью jQuery, используя
$.ajax()
метод if FormData и File API (обе функции HTML5).Вы также можете отправлять файлы без FormData, но в любом случае должен быть представлен API-интерфейс файлов для обработки файлов таким образом, чтобы их можно было отправлять с помощью XMLHttpRequest (Ajax).
Быстрый, чистый пример JavaScript ( без jQuery ) см. В разделе « Отправка файлов с использованием объекта FormData ».
Отступать
Когда HTML5 не поддерживается (без File API ), единственным другим чистым решением JavaScript (без Flash или любого другого подключаемого модуля браузера) является скрытый метод iframe , который позволяет эмулировать асинхронный запрос без использования объекта XMLHttpRequest .
Он состоит из установки iframe в качестве цели формы с входными данными файла. Когда пользователь отправляет запрос, создается и файлы загружаются, но ответ отображается внутри iframe вместо повторного рендеринга главной страницы. Скрытие iframe делает весь процесс прозрачным для пользователя и эмулирует асинхронный запрос.
Если все сделано правильно, он должен работать практически в любом браузере, но у него есть некоторые предостережения относительно того, как получить ответ от iframe.
В этом случае вы можете предпочесть использовать плагин-оболочку, такой как Bifröst, который использует технику iframe, но также предоставляет транспорт jQuery Ajax, позволяющий отправлять файлы с помощью только такого
$.ajax()
метода:Плагины
Bifröst - это просто небольшая оболочка, которая добавляет поддержку отката в метод jjuery ajax, но многие из вышеупомянутых плагинов, такие как плагин jQuery Form или jQuery File Upload, включают целый стек из HTML5 для различных откатов и некоторые полезные функции для облегчения процесса. В зависимости от ваших потребностей и требований вы можете рассмотреть пустую реализацию или один из этих плагинов.
источник
contentType: false
. Когда я не отправил это с Chrome, тип содержимого формы был признан недействительным jQuery..done()
и.fail()
обратных вызовов. Кроме того, пример без использованияFormData
и список плюсов / минусов был бы потрясающим.TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement.
Этот плагин JQuery для загрузки AJAX-файлов загружает файл где-то и передает ответ на обратный вызов, ничего больше.
<input type="file">
- Используйте всего лишь -
- или столько, сколько -
источник
Я использовал приведенный ниже скрипт для загрузки изображений, который работает нормально.
HTML
JavaScript
объяснение
Я использую ответ
div
чтобы показать анимацию загрузки и ответ после загрузки.Самое приятное, что при использовании этого сценария вы можете отправить дополнительные данные, такие как идентификаторы и т. Д. Вместе с файлом. Я упомянул это
extra-data
как в сценарии.На уровне PHP это будет работать как обычная загрузка файлов. дополнительные данные могут быть получены как
$_POST
данные.Здесь вы не используете плагин и прочее. Вы можете изменить код, как вы хотите. Вы не слепо кодируете здесь. Это основная функциональность любой загрузки файла jQuery. На самом деле Javascript.
источник
addEventListener
не кросс-браузерВы можете сделать это в обычном JavaScript довольно легко. Вот фрагмент моего текущего проекта:
источник
ondrop
мероприятия вы можете сделатьvar file = e.dataTransfer.files[0]
Вы можете загрузить просто с JQuery
.ajax()
.HTML:
CSS
Javascript:
источник
Самый простой и надежный способ, которым я занимался в прошлом, - это просто нацелить скрытый тег iFrame с помощью своей формы - тогда он будет отправлен в iframe без перезагрузки страницы.
То есть, если вы не хотите использовать плагин, JavaScript или любые другие формы «магии», кроме HTML. Конечно, вы можете объединить это с JavaScript или что у вас ...
Вы также можете прочитать содержимое iframe
onLoad
для ошибок сервера или успешного ответа, а затем вывести его пользователю.Chrome, iFrames и onLoad
-Примечание- вам нужно только продолжать чтение, если вы заинтересованы в том, как настроить блокировщик пользовательского интерфейса при загрузке / загрузке
В настоящее время Chrome не вызывает событие onLoad для iframe, когда оно используется для передачи файлов. Firefox, IE и Edge запускают событие onload для передачи файлов.
Единственным решением, которое я нашел для Chrome, было использование куки.
Чтобы сделать это в основном, когда начата загрузка / выгрузка:
Использование куки для этого уродливо, но это работает.
Я сделал плагин jQuery для решения этой проблемы для Chrome при загрузке, вы можете найти здесь
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDownloader.js
Тот же основной принцип применим и к загрузке.
Чтобы использовать загрузчик (включая JS, очевидно)
А на стороне сервера, непосредственно перед передачей данных файла, создайте cookie
Плагин увидит куки, а затем вызовет
onComplete
обратный вызов.источник
Решение, которое я нашел, состояло в том, чтобы у
<form>
цели был скрытый кадр. Затем iFrame может запустить JS, чтобы показать пользователю, что он завершен (при загрузке страницы).источник
Я написал это в среде Rails . Это всего лишь пять строк JavaScript, если вы используете легкий плагин jQuery-form.
Задача состоит в том, чтобы загрузить AJAX как стандарт
remote_form_for
не понимает отправку форм из нескольких частей. Он не собирается отправлять данные файла, которые Rails ищет обратно с помощью запроса AJAX.Вот где плагин JQuery-формы вступает в игру.
Вот код Rails для этого:
Вот связанный JavaScript:
А вот действие контроллера Rails, довольно ванильное:
Я использовал это в течение последних нескольких недель с Bloggity, и он работал как чемпион.
источник
Простой Ajax Uploader - это еще один вариант:
https://github.com/LPology/Simple-Ajax-Uploader
Пример использования:
источник
IE7+
! Попробуй это сейчас. СпасибоjQuery Uploadify - еще один хороший плагин, который я использовал для загрузки файлов. Код JavaScript так же прост: код. Однако новая версия не работает в Internet Explorer.
Я много занимался поиском и нашел другое решение для загрузки файлов без какого-либо плагина и только с помощью AJAX. Решение как ниже:
источник
Вот еще одно решение о том, как загрузить файл ( без какого-либо плагина )
Использование простых Javascripts и AJAX (с индикатором выполнения)
HTML часть
JS часть
PHP часть
Вот пример приложения
источник
Вы можете использовать данные формы для публикации всех ваших значений, включая изображения.
источник
cache: false
избыточно поPOST
запросу, посколькуPOST
никогда не кэшируется.TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement.
Чтобы загрузить файл асинхронно с Jquery, используйте следующие шаги:
Шаг 1 В вашем проекте откройте диспетчер Nuget и добавьте пакет (jquery fileupload (только вам нужно написать его в поле поиска, он появится и установить его). URL: https://github.com/blueimp/jQuery-File- Загрузить
Шаг 2 Добавьте нижеприведенные скрипты в файлы HTML, которые уже добавлены в проект, запустив вышеуказанный пакет:
Шаг 3 Напишите элемент управления загрузкой файла согласно приведенному ниже коду:
шаг 4, напишите метод js как uploadFile, как показано ниже:
шаг 5 При загрузке файла элемента вызова готовой функции, чтобы запустить процесс, как показано ниже:
Шаг 6 Запишите контроллер MVC и Действие, как показано ниже:
источник
Современный подход без Jquery состоит в том, чтобы использовать объект FileList, который вы получаете,
<input type="file">
когда пользователь выбирает файл (-ы), а затем использовать Fetch для публикации FileList, обернутого вокруг объекта FormData .источник
Вы можете увидеть , решаемой решение с рабочим демо здесь , что позволяет просматривать и представлять файлы формы на сервер. В вашем случае вам нужно использовать Ajax для облегчения загрузки файла на сервер:
Представляемые данные являются форматы данных. В вашем jQuery используйте функцию отправки формы вместо нажатия кнопки, чтобы отправить файл формы, как показано ниже.
Посмотреть больше деталей
источник
Пример: если вы используете jQuery, вы можете легко загрузить файл. Это небольшой и сильный плагин jQuery, http://jquery.malsup.com/form/ .
пример
Я надеюсь, что это будет полезно
источник
Ты можешь использовать
демонстрация
источник
Конвертируйте файл в base64, используя readAsDataURL () HTML5 или какой- либо кодировщик base64 . Скрипка здесь
Затем получить:
источник
Вы можете передать дополнительные параметры вместе с именем файла при выполнении асинхронной загрузки с использованием XMLHttpRequest (без зависимости flash и iframe). Добавьте значение дополнительного параметра с помощью FormData и отправьте запрос на загрузку.
Кроме того, загрузка файла интерфейса пользователя Syncfusion JavaScript предоставляет решение для этого сценария, просто используя аргумент события. вы можете найти документацию здесь и более подробную информацию об этом элементе управления здесь, введите описание ссылки здесь
источник
Посмотрите на Обработка процесса загрузки для файла, асинхронно здесь: https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications
Образец по ссылке
источник
Это моё решение.
и JS
контроллер
источник
Используя HTML5 и JavaScript , выгрузка асинхронных файлов довольно проста, я создаю логику выгрузки вместе с вашим html, она не полностью работает, поскольку требует API, но продемонстрирую, как она работает, если у вас есть конечная точка, вызванная
/upload
из корня вашего сайта, этот код должен работать для вас:Также некоторая дополнительная информация о XMLHttpReques:
Для более подробной информации, вы можете продолжить чтение здесь ...
источник
Вы можете использовать более новый Fetch API с помощью JavaScript. Нравится:
Преимущество: Fetch API изначально поддерживается всеми современными браузерами, поэтому вам не нужно ничего импортировать. Также обратите внимание, что fetch () возвращает Promise, который затем обрабатывается
.then(..code to handle response..)
асинхронно.источник
Вы можете выполнять асинхронную загрузку нескольких файлов, используя JavaScript или jQuery, и это без использования какого-либо плагина. Вы также можете отобразить прогресс загрузки файла в режиме реального времени в контроле прогресса. Я наткнулся на 2 хорошие ссылки -
Серверный язык - C #, но вы можете внести некоторые изменения, чтобы он работал с другим языком, таким как PHP.
Загрузка файла ASP.NET Core MVC:
В представлении создания файла управления загрузкой в HTML:
Теперь создайте метод действия в вашем контроллере:
Переменная hostingEnvironment имеет тип IHostingEnvironment, который может быть введен в контроллер с помощью внедрения зависимости, например:
источник
Для PHP, посмотрите https://developer.hyvor.com/php/image-upload-ajax-php-mysql
HTML
JAVASCRIPT
PHP
источник
Вы также можете использовать что-то вроде https://uppy.io .
Он выполняет загрузку файлов без перехода со страницы и предлагает несколько бонусов, таких как перетаскивание, возобновление загрузки в случае сбоя браузера / нестабильных сетей и импорт, например, из Instagram. Это открытый исходный код и не зависит от jQuery / React / Angular / Vue, но может использоваться с ним. Отказ от ответственности: как его создатель я предвзято;)
источник