Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Submit Формы после выбора файла (https://javascript.ru/forum/misc/54524-submit-formy-posle-vybora-fajjla.html)

haa 21.03.2015 09:17

Submit Формы после выбора файла
 
Есть код на js, отправить форму после выбора файла. Когда выбираю файл обновляет страничку и все, а на базу не записывает. А без js т.е вручную работает. Может кто знает в чем проблема?
jQuery(document).ready(function(){
     
	   	form = $("#formid"), upload = $("#select");
	    upload.change(function(){
	      form.submit();
	    });

    });


<form method="POST" action="" id="formid" enctype="multipart/form-data">
		    <input type="file" name="uploadfile" id="select">
		    <input type="submit" name="uploadfile" style="display: none;">
		</div>
	</form>

danik.js 21.03.2015 09:56

Цитата:

Сообщение от haa
name="uploadfile"

Убери name у кнопки. Или измени. Хотя по идее должно наоборот без js не работать.
И кнопку не скрывай, а засунь ее в <noscript>

laimas 21.03.2015 10:09

обновляет страничку и все, а на базу не записывает

Что за файл, как получаете файл и записываете?

haa 21.03.2015 10:16

При нажатии $_POST['uploadfile']

Загруженный файл
$file = $_FILES['uploadfile']['name']

mySQL запрос
UPDATE users SET photo=$file

haa 21.03.2015 10:24

Цитата:

Сообщение от danik.js (Сообщение 362335)
Убери name у кнопки. Или измени. Хотя по идее должно наоборот без js не работать.
И кнопку не скрывай, а засунь ее в <noscript>

не работает

laimas 21.03.2015 10:28

Ну так это не запись файла в базу, это имя файла в базе. Прежде чем писать в базу, вы проверку делаете того что получаете?

PS. И так нельзя записывать даже имя.

haa 21.03.2015 10:36

Ну да, делаю проверку, ну тут же дело не втом что я получаю, а мне просто надо записать имя полученного файла. А как можно записать имя ?

Когда сам нажимаю на кнопку записывает, обновляет. Все работает как надо.

laimas 21.03.2015 10:49

Имя нужно записывать как минимум так basename($_FILES['uploadfile']['name']), естественно после того как удостоверившись, что все соответствует ожиданиям.

А получает ли сервер файл можно проверить, что показывает массив принятый?

haa 21.03.2015 11:35

Да, да да , я знаю что такое base name. Но вопрос то не в этом.
Массив показывает ошибку если отправить форму вручную. Тут дело в js

laimas 21.03.2015 12:05

В показанном коде ошибки нет, я не могу продемонстрировать здесь, но это код будет работать, могу снимки с экрана только показать.

А вот ошибки в массиве $_FILES на сервере говорят о том, что файл передается, иначе бы массив был пуст. По номеру ошибки можно судить что происходит.

Знаете что такое basename(), так почему не используете.

haa 21.03.2015 22:25

То что говорите вы абсолютно правильно. Но они не касаются моей проблемы.

Давайте посмотрим по другому.
Есть js код, который должен отправить форму когда пользователь выбрал файл и вывести на экран слово test
jQuery(document).ready(function(){
     
	   	form = $("#formid"), upload = $("#formid #select");
	    upload.change(function(){
	      form.submit();
	    });

    });


js код должен нажать кнопку $_POST['upload']
if(!empty($_POST['upload']))   
{ 
echo 'test';
}

когда js отправляет форму то нечего не выводит, а если убрать if(!empty($_POST['upload'])) или вручную отправить, то выводит ''test"
Почему когда форму отправляет js не выводит "test"???

laimas 22.03.2015 04:45

Давайте по другому:

1) if(!empty($_POST['upload'])) - массив $_POST к приему файлов отношения не имеет, если только форма не содержит поля я именем 'upload'.

2) Проверку загруженного файла нужно начинать с проверки ошибок загрузки - if(!$_FILES['field_name']['error']) { действия }

Выполните у себя вот этот код отдельно. С передачей проблем не будет.

<form method="post" enctype="multipart/form-data">
     <input type="file" name="upload" onchange="this.form.submit()">
     <input name="data" value="test">
</form>


<?
echo '<pre>';
print_r($_POST);
print_r($_FILES);


Это к "о не способности отправить скриптом". Не отправляться будет только при наличие ошибок в коде вашем.

haa 22.03.2015 09:02

форма отправился

Array
(
    [data] => test
)
Array
(
    [upload] => Array
        (
            [name] => 1HO-u9lMQXc.jpg
            [type] => image/jpeg
            [tmp_name] => /tmp/php2hO4nd
            [error] => 0
            [size] => 35316
        )

)

danik.js 22.03.2015 11:27

Когда жмешь кнопку, то отправляется ее имя, тоесть на сервере ты получаешь $_POST['uploadfile'].
А когда кнопку не жмешь, то есть когда сабмитишь через .submit() кнопка не отправляется. Вот в чем твоя ошибка - ты на сервере проверяешь $_POST['uploadfile'], а нужно проверять файл.

haa 22.03.2015 12:12

Как я понял мне надо проверить на php загружен ли файл?

laimas 22.03.2015 12:35

Ну если ваш серверный скрипт, это РНР, на чем же еще вы будете проверять? Вот только проверять и получать информацию о загрузке нужно не в массиве $_POST, а в массиве $_FILES. Если его ключ error равен 0, значит файл загружен успешно и его надо переместить из временной папки /tmp/php2hO4nd в необходимый каталог.

Массив $_POST при этом будет содержать данные формы, если они передавались наряду с файлом, иначе пустой.

haa 22.03.2015 12:54

Спасибо, помогли разобраться.


Часовой пояс GMT +3, время: 08:45.