jQuery ajax аплоад файлов
пытаюсь сделать аплоад файлов на сервер.
задача: выбрать локальный файл, указать для него параметры (описание, какй-то тип, не важно, это указывает юзер) и по сабмиту отправить его, а все введённые параметры записать в базу. использую jQueryForm. получается всё, кроме загрузки файла. пробовал плагины alaxfileuploader, oneclickupload. если грузить файл отдельно, то работает. если передавать еще и параметры, вылазит "Error: Form elements must not be named "submit"." В какую сторону копать? мож я принципиально чтото не так делаю, jquery только начал изучать. |
код?
|
$(document).ready(function() { var options = { beforeSubmit: showRequest, // pre-submit callback success: showResponse // post-submit callback }; $('#formadd').submit(function() { $(this).ajaxSubmit(options); return false; }); $('#upload1').upload({ name: 'file', method: 'post', enctype: 'multipart/form-data', action: 'upload.php' }); }); function showRequest(formData, jqForm, options) { var queryString = $.param(formData); alert('About to submit: \n\n' + queryString); centerPopup(); loadPopup(); return true; } function showResponse(responseText, statusText) { disablePopup(); alert('status: ' + statusText + '\n\nresponseText: \n' + responseText); } |
Цитата:
|
передаются еще несколько текстовых полей, чекбокс и выпадающий список.
|
а что говориться в сообщении об ошибке понимаешь?
|
понимаю.
но когда нет кода, где передаётся файл, то всё работает отлично, и его сабмиты не волнуют ) |
а что происходит, если исправить код в соответствии с ошибкой?
|
извините, я чуть не правильно описал проблемму.
такая ошибка вылазит, когда используется обычный инпут типа файл. когда используется ванкликаплоад, он работает, только он шлёт сабмит, когда я выбираю файл, то есть не даёт установить другие параметры ( как всё запутано |
ммм ... а такой вариант?
$('#upload1').upload({ name: 'file', method: 'post', enctype: 'multipart/form-data', action: 'upload.php', [B] onSubmit: function() { $('#formadd').ajaxSubmit(options);[/B] }, onComplete: function(data) { $('#progress1').text('Файл успешно отправлен'); } }); |
1) one-click upload: читаем документацию
2) ajaxSubmit: что говориться в сообщении об ошибке? 3) Цитата:
4) зачем тебе и jquery form и one-click upload? 5) что ты вообще пытаешься сделать? Для upload'а файлов на сервер javascript не нужен |
Угу, не полностью понимаю как это всё реализовать(
Итак, задача. Нужно загрузить на сервер файл, для этого файла указать некоторое описание и указать некоторую категорию. файл может быть большой. и пока будет происходить загрузка файла, нужен прогресбар Загрузка. |
http://plugins.jquery.com/
ключевые слова upload progress |
есть, кстати, такая штука - http://swfupload.org/
|
видеть, сколько осталось, не обязательно. да и флеш не желательно.
меня устраивает вариант с ocupload. но опять же, при выборе файла происходит автосабмит, хотя autoSubmit: false. $(document).ready(function() { var options = { beforeSubmit: showRequest, // pre-submit callback success: showResponse // post-submit callback }; var myUpload = $(upload).upload({ name: 'file', action: 'post.php', enctype: 'multipart/form-data', autoSubmit: false }); popupStatus = 0; $('#formadd').submit(function() { $(this).ajaxSubmit(options); return false; }); }); function showRequest(formData, jqForm, options) { var queryString = $.param(formData); alert('About to submit: \n\n' + queryString); centerPopup(); loadPopup(); return true; } function showResponse(responseText, statusText) { disablePopup(); alert('status: ' + statusText + '\n\nresponseText: \n' + responseText); } я ж не сложного хочу, но никак не пойму, что не так делаю |
тебе же нужен progress bar: где написано, что он есть в one-click upload?
по поводу автосабмита: ты документацию читал? Там все написано зачем ты используешь ajaxSubmit? Пытайся понять, что ты делаешь, это полезно ;) |
переделал.
function FormClick () { centerPopup(); loadPopup(); var str = $("#formadd").serialize(); $.post("post.php", str, function(data) { disablePopup(); alert('status: ' + data); }); } HTML <FORM action="post.php" method="post" enctype="multipart/form-data" name="formadd" id="formadd"> <INPUT type="file" name="file"> <INPUT type="button" name="add" value="Add" onclick="FormClick(); return false"> </FORM> PHP <?php sleep (3); echo $_FILES['file']['name']; ?> возвращает ничего |
давай ты начнешь с того, что спросишь, что тебе непонятно в твоем коде? Потом ты сам сможешь ответить, почему оно ничего не возвращает
|
в коде из последнего поста всё понятно. любые другие параметры передаются. а файл нет.
|
... var str = $("#formadd").serialize(); alert(str); $.post("post.php", str, function(data) { ... что выдает alert? |
все введенные в форме значения, кроме поля file
|
т.е. еще на клиентской стороне input type=file игнорируется. А все потому, что javascript не может получить доступ к файловой системе, к передаваемому файлу, выбрать файл - ограничения безопасности, чтобы javascript не мог утащить у пользователя информацию без его ведома... javascript может лишь спрашивать у сервера, что там с загрузкой файла, либо организовать передачу файла без перезагрзки страницы
т.е. надо искать плагины, которые рассчитаны на работу с input-type="file" |
Цитата:
|
Цитата:
или ты про то, что обычно что-то не устраивает? |
Я про то, что элементарную вещь, вроде фоновой отправки файлов на сервер, превратили в размусоливание плагинов jQuery.
|
вообще-то не знаю... имхо начинать можно с jQuery+плагины, а потом можно либо свои плагины начать писать, либо от jQuery отказаться
|
Получилось так, с помощью http://valums.com/ajax-upload/
$(document).ready(function() { new Ajax_upload('#upload', { action: 'post.php', name: 'myfile', onSubmit : function(file){ centerPopup(); loadPopup(); var str = $("#formadd").serialize(); alert(str); $.post("post.php", str, function(data) { alert('status: ' + data); }); }, onComplete : function(file){ disablePopup(); alert(file + " succesfully upload"); } }); }); |
т.е. ты предпочитаешь делать два запроса вместо одного? И отдельно принимать файл и остальные параметры? И что у тебя форма отправляется сразу после выбора файла?
|
то что отправляется сразу после выбора файла это не критично.
а то что два запроса ... по другому пока никак не придумал( |
Цитата:
|
Цитата:
frstua, какой вариант выбираешь? ;) Цитата:
|
документация? ммм
ты имеешь ввиду: var myUpload = $(element).upload({ params: {name: $(”#name”).value, description: $(”#descr”).value} ?? |
я имею в виду: поищи здесь слово autoSubmit
|
имеем
$('#upload').upload({ name: 'file', method: 'post', enctype: 'multipart/form-data', action: 'post.php', autoSubmit: false, onSubmit: function() {}, onComplete: function() {} }); и всё равно форма сабмитится после выбора файла |
ну что ж, one-click upload тупо игнорирует autoSubmit (почему-то)
значит надо либо искать другой плагин, либо исправлять этот, либо забить на этот jQuery и сделать все самому, как советовал Kolyaj |
Цитата:
|
это называется "сделано через ...": во-первых, лишний запрос, во-вторых, тебя устраивает, что файл передается отдельно от остальных параметров?
Или у тебя только один файл должен передаваться? какие у тебя параметры, кроме файла, есть на этой форме? |
Цитата:
|
всё таки бок есть, если передаются два запроса. получается добавление в базу два раза ((
У меня есть файл и есть к нему описание с текстового поля и тип с выпадающего списка. юзер указывает описание, тип, выбирает файл, жмёт отправить. после нажатия вылазит окно "ждите загрузка", после загрузки окно пропадает, появляется например "загрузка прошла успешно". на сервере в базу добавляется запись с именем файла типом и описанием. |
$(document).ready(function() { var upload = new Ajax_upload('#upload', { action: 'post.php', name: 'file', autoSubmit: true, onSubmit : function(){ upload.setData({'descr': $("#descr").val(), 'mxsw': $("#checkbox").val(), 'typebase': $("#typebase").val()}); centerPopup(); loadPopup(); }, onComplete : function(file){ disablePopup(); alert(file + " succesfully upload"); } }); }); |
Часовой пояс GMT +3, время: 13:52. |