Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   jQuery ajax аплоад файлов (https://javascript.ru/forum/jquery/3649-jquery-ajax-apload-fajjlov.html)

frstua 12.05.2009 18:11

jQuery ajax аплоад файлов
 
пытаюсь сделать аплоад файлов на сервер.
задача: выбрать локальный файл, указать для него параметры (описание, какй-то тип, не важно, это указывает юзер) и по сабмиту отправить его, а все введённые параметры записать в базу. использую jQueryForm.
получается всё, кроме загрузки файла. пробовал плагины alaxfileuploader, oneclickupload. если грузить файл отдельно, то работает. если передавать еще и параметры, вылазит
"Error: Form elements must not be named "submit"."
В какую сторону копать? мож я принципиально чтото не так делаю, jquery только начал изучать.

x-yuri 12.05.2009 21:33

код?

frstua 12.05.2009 22:11

$(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); 
	}

x-yuri 12.05.2009 22:18

Цитата:

если передавать еще и параметры, вылазит
о каких параметрах речь?

frstua 12.05.2009 22:22

передаются еще несколько текстовых полей, чекбокс и выпадающий список.

x-yuri 12.05.2009 22:37

а что говориться в сообщении об ошибке понимаешь?

frstua 12.05.2009 22:58

понимаю.
но когда нет кода, где передаётся файл, то всё работает отлично, и его сабмиты не волнуют )

x-yuri 12.05.2009 23:04

а что происходит, если исправить код в соответствии с ошибкой?

frstua 12.05.2009 23:12

извините, я чуть не правильно описал проблемму.
такая ошибка вылазит, когда используется обычный инпут типа файл.
когда используется ванкликаплоад, он работает, только он шлёт сабмит, когда я выбираю файл, то есть не даёт установить другие параметры
(
как всё запутано

frstua 12.05.2009 23:16

ммм ... а такой вариант?
$('#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('Файл успешно отправлен');
       }
});

x-yuri 13.05.2009 10:59

1) one-click upload: читаем документацию
2) ajaxSubmit: что говориться в сообщении об ошибке?
3)
Цитата:

ммм ... а такой вариант?
ты просто пробуешь разные варианты, не пытаясь понять, как его использовать
4) зачем тебе и jquery form и one-click upload?
5) что ты вообще пытаешься сделать? Для upload'а файлов на сервер javascript не нужен

frstua 13.05.2009 11:34

Угу, не полностью понимаю как это всё реализовать(
Итак, задача.
Нужно загрузить на сервер файл, для этого файла указать некоторое описание и указать некоторую категорию. файл может быть большой. и пока будет происходить загрузка файла, нужен прогресбар Загрузка.

x-yuri 13.05.2009 11:46

http://plugins.jquery.com/
ключевые слова upload progress

x-yuri 13.05.2009 11:53

есть, кстати, такая штука - http://swfupload.org/

frstua 13.05.2009 12:25

видеть, сколько осталось, не обязательно. да и флеш не желательно.
меня устраивает вариант с 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); 
	}


я ж не сложного хочу, но никак не пойму, что не так делаю

x-yuri 13.05.2009 13:42

тебе же нужен progress bar: где написано, что он есть в one-click upload?

по поводу автосабмита: ты документацию читал? Там все написано

зачем ты используешь ajaxSubmit? Пытайся понять, что ты делаешь, это полезно ;)

frstua 13.05.2009 14:22

переделал.
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'];
?>

возвращает ничего

x-yuri 13.05.2009 14:45

давай ты начнешь с того, что спросишь, что тебе непонятно в твоем коде? Потом ты сам сможешь ответить, почему оно ничего не возвращает

frstua 13.05.2009 14:47

в коде из последнего поста всё понятно. любые другие параметры передаются. а файл нет.

x-yuri 13.05.2009 14:51

...
  var str = $("#formadd").serialize();
alert(str);
  $.post("post.php", str, function(data) {
...

что выдает alert?

frstua 13.05.2009 14:57

все введенные в форме значения, кроме поля file

x-yuri 13.05.2009 15:10

т.е. еще на клиентской стороне input type=file игнорируется. А все потому, что javascript не может получить доступ к файловой системе, к передаваемому файлу, выбрать файл - ограничения безопасности, чтобы javascript не мог утащить у пользователя информацию без его ведома... javascript может лишь спрашивать у сервера, что там с загрузкой файла, либо организовать передачу файла без перезагрзки страницы
т.е. надо искать плагины, которые рассчитаны на работу с input-type="file"

Kolyaj 13.05.2009 15:24

Цитата:

Сообщение от x-yuri
т.е. надо искать плагины, которые рассчитаны на работу с

Вот она, квинтэссенция работы с jQuery.

x-yuri 13.05.2009 15:43

Цитата:

Вот она, квинтэссенция работы с jQuery
ну почему так грустно, со временем можно и самому плагины начать писать :) А вообще, это как плюс, так и минус
или ты про то, что обычно что-то не устраивает?

Kolyaj 13.05.2009 15:55

Я про то, что элементарную вещь, вроде фоновой отправки файлов на сервер, превратили в размусоливание плагинов jQuery.

x-yuri 13.05.2009 16:22

вообще-то не знаю... имхо начинать можно с jQuery+плагины, а потом можно либо свои плагины начать писать, либо от jQuery отказаться

frstua 13.05.2009 18:11

Получилось так, с помощью 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");
		}	

	});	
});

x-yuri 13.05.2009 18:47

т.е. ты предпочитаешь делать два запроса вместо одного? И отдельно принимать файл и остальные параметры? И что у тебя форма отправляется сразу после выбора файла?

frstua 13.05.2009 21:34

то что отправляется сразу после выбора файла это не критично.
а то что два запроса ... по другому пока никак не придумал(

Kolyaj 13.05.2009 21:40

Цитата:

Сообщение от frstua
по другому пока никак не придумал(

Создаете невидимый ифрейм, даете ему имя, устанавливаете это имя в атрибуте target формы. Все, файлы загружаются в фоновом режиме вместе с остальной формой. Не надо никаких jQuery.

x-yuri 13.05.2009 22:08

Цитата:

Не надо никаких jQuery
но ведь можно просто нужный плагин найти :yes: на самом деле, все плагины, которые здесь упоминались, для фоновой загрузки подходят :yes: :yes:
frstua, какой вариант выбираешь? ;)

Цитата:

а то что два запроса ... по другому пока никак не придумал(
почитай документацию по one-click upload

frstua 13.05.2009 22:17

документация? ммм
ты имеешь ввиду:
var myUpload = $(element).upload({
        params: {name: $(”#name”).value, description: $(”#descr”).value}


??

x-yuri 14.05.2009 10:30

я имею в виду: поищи здесь слово autoSubmit

frstua 14.05.2009 13:07

имеем
$('#upload').upload({
       name: 'file',
       method: 'post',
       enctype: 'multipart/form-data',
       action: 'post.php',
       autoSubmit: false,
       onSubmit: function() {},
       onComplete: function() {}
});

и всё равно форма сабмитится после выбора файла

x-yuri 14.05.2009 13:41

ну что ж, one-click upload тупо игнорирует autoSubmit (почему-то)
значит надо либо искать другой плагин, либо исправлять этот, либо забить на этот jQuery и сделать все самому, как советовал Kolyaj

frstua 14.05.2009 13:59

Цитата:

Сообщение от x-yuri (Сообщение 18815)
т.е. ты предпочитаешь делать два запроса вместо одного? И отдельно принимать файл и остальные параметры? ...

а чем это плохо?

x-yuri 14.05.2009 14:32

это называется "сделано через ...": во-первых, лишний запрос, во-вторых, тебя устраивает, что файл передается отдельно от остальных параметров?
Или у тебя только один файл должен передаваться? какие у тебя параметры, кроме файла, есть на этой форме?

Kolyaj 14.05.2009 14:36

Цитата:

Сообщение от x-yuri
забить на этот jQuery и сделать все самому

В том и дело, что делать там ничего не надо.

frstua 14.05.2009 14:51

всё таки бок есть, если передаются два запроса. получается добавление в базу два раза ((

У меня есть файл и есть к нему описание с текстового поля и тип с выпадающего списка.
юзер указывает описание, тип, выбирает файл, жмёт отправить. после нажатия вылазит окно "ждите загрузка", после загрузки окно пропадает, появляется например "загрузка прошла успешно".

на сервере в базу добавляется запись с именем файла типом и описанием.

frstua 14.05.2009 18:05

$(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.