21.09.2017, 16:37
|
Аспирант
|
|
Регистрация: 07.09.2016
Сообщений: 83
|
|
Отправка нескольких изображений и текст.-данных
Здравствуйте. Нужно отправить по AJAX изображения и текстовые данные.
Код отправки сделал вот так (взяв пример отсюда):
Код HTML:
<form method='POST' id='formSlaid'>
<select id='slaidSelect'><option value='1'>1</option><option value='2'>2</option><option value='3'>3</option></select>
<input type='file' id='slaidRasem' accept='image/jpeg'>
<input type='text' id='slaidAnlatma' maxlength='127'>
<input type='button' value='Save' id='slaidToima'>
</form>
Код JS:
$("#slaidToima").click(function(){
var file_data = $('#slaidRasem').prop('files')[0];
var form_data = new FormData();
form_data.append('file', file_data);
$.ajax ({
url: "/ajax1.php",
type: "POST",
data: form_data,
dataType: "text",
cache: false,
contentType: false,
processData: false,
success: function(data) {
alert(data);
/*
if (data >= 1) {
alert("Сохранено успешно.");
} else {
alert("Ошибка выполнения.");
}*/
}
});
});
И php-код AJAX:
if ( 0 < $_FILES['file']['error'] ) {
echo 'Error: '.$_FILES['file']['error'];
} else {
if(move_uploaded_file($_FILES['file']['tmp_name'], 'images/slide/rasemnar/'.$_FILES['file']['name'])){
echo "+";
}else{
echo "-";
}
}
Этот код работает. Но проблема в том, что этот код отправляет одно единственное изображение (ну, или другой файл). А мне нужно, чтобы отправлять в одном случае - 2 изображения, в другом - изображение и несколько текстовых инпутов.
В обычном AJAX я делал это так:
data: ({
toima: "slaidlar",
slaidIsem: $(this.form).children("#slaidAnlatma").val(),
slaidId: $(this).data("slaidId")
})
А тут пишется " data:" и сразу переменная.
Помогите пожалуйста, как мне решить эту проблему?
|
|
21.09.2017, 20:10
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 4,662
|
|
Сообщение от Булат Азат улы
|
А мне нужно, чтобы отправлять в одном случае - 2 изображения
|
А как пользователь сможет ввести два изображения?
|
|
21.09.2017, 20:31
|
Аспирант
|
|
Регистрация: 07.09.2016
Сообщений: 83
|
|
Rise,
В двух разных инпутах:
<form method='POST' id='formSlaid'>
<input type='file' id='slaidRasem' accept='image/jpeg'>
<input type='file' id='slaidRasem1' accept='image/jpeg'>
<input type='button' value='Save' id='slaidToima'>
</form>
|
|
21.09.2017, 22:37
|
Профессор
|
|
Регистрация: 17.06.2016
Сообщений: 509
|
|
Булат Азат улы,
<form id='formSlaid' name="form">
<select name="fields[]" id='slaidSelect'>
<option value='1'>1</option>
<option value='2'>2</option>
<option value='3'>3</option>
</select>
<input type='file' id='slaidRasem' accept='image/jpeg'>
<input type='file' id='slaidRasem1' accept='image/jpeg'>
<input type='text' name="fields[]" id='slaidAnlatma'>
<input type='submit' value='Save' id='slaidToima'>
</form>
$("#formSlaid").submit(function(e){
e.preventDefault();
var form_data = new FormData(document.forms.form);
$('input[type="file"]').each(function(i, el) {
var file_data = $(el).prop('files')[0];
form_data.append('files[]', file_data);
});
var data = $(this).serialize();
$.ajax ({
url: "/ajax1.php",
type: "POST",
data: form_data,
dataType: "text",
cache: false,
contentType: false,
processData: false,
success: function(data) {
console.log(data);
/*
if (data >= 1) {
alert("Сохранено успешно.");
} else {
alert("Ошибка выполнения.");
}*/
}
});
});
if (empty($_POST)) exit;
function err($a, $b) {
$a += $b;
return $a;
}
$is_err = array_reduce($_FILES['files']['error'], "err");
if ($is_err) {
foreach ($_FILES['files']['error'] as $error) {
if ($error) echo 'Error: '.$error;
}
exit;
}
foreach ($_FILES['files']['tmp_name'] as $key => $tmp) {
if (move_uploaded_file($tmp, 'images/slide/rasemnar/'.$_FILES['files']['name'][$key])){
echo "+";
} else {
echo "-";
}
}
echo "<pre>";
print_r($_POST);
echo "</pre>";
|
|
21.09.2017, 23:53
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Булат Азат улы,
если несколько файлов, тогда и form_data.append('file', file_data); не один должен быть.
Это можно и проще сделать - одно поле с атрибутом multiple и именем как например files[]. Отправляемые данные при этом
data: new FormData(this),
где this форма
и на сервер будут отправлены и имена, и файлы. Только на сервере не
$_FILES['file']['name']
а
basename($_FILES['file']['name'])
|
|
22.09.2017, 01:58
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 4,662
|
|
Булат Азат улы,
сделай чтобы форма работала без js, будет уроком как надо формы оформлять, и затем останется только подключить скрипт:
$('[name=formName]').submit(function(e) {
e.preventDefault();
$.ajax({
method: this.method,
url: this.action,
data: new FormData(this),
contentType: false,
processData: false
}).done(function(data, textStatus, jqXHR) {
alert(data);
}).fail(function(jqXHR, textStatus, errorThrown) {
alert('fail: ' + textStatus);
});
});
Последний раз редактировалось Rise, 22.09.2017 в 02:01.
|
|
22.09.2017, 11:00
|
Аспирант
|
|
Регистрация: 07.09.2016
Сообщений: 83
|
|
Сообщение от laimas
|
Только на сервере не
$_FILES['file']['name']
а
basename($_FILES['file']['name'])
|
laimas,
Отправку multiple я сделать не смогу, так как каждое из двух изображений мне нужно по отдельности (первое изображение - оригинал, а второе - уменьшенный и облегченный его вариант (для сайта, после нажатия на него выйдет большой)). Поэтому, нужно определенно знать, какое изображение есть для чего.
А не могли бы сказать подробнее об этом?
basename($_FILES['file']['name'])
С выводом файла пример понял. А как вывести обычное текстовое поле? Так:
basename($_POST['text'])
?
|
|
22.09.2017, 11:50
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Булат Азат улы
|
Отправку multiple я сделать не смогу, так как каждое из двух изображений мне нужно по отдельности (первое изображение - оригинал, а второе - уменьшенный и облегченный его вариант (для сайта, после нажатия на него выйдет большой)). Поэтому, нужно определенно знать, какое изображение есть для чего.
|
Почему же нельзя, можно, просто серверный скрипт серьезнее будет. Ну может и два отдельных поля, это не так принципиально.
Сообщение от Булат Азат улы
|
А не могли бы сказать подробнее об этом?
basename($_FILES['file']['name'])
|
Все заголовки получаемые сервером на клиенте можно подделать, то есть вместо имени файла могут заказать "опасный" путь. Функция basename удаляет все, кроме имени файла. Это очень обширная тема "безопасность веб", затрагивающая многие аспекты, в сети ищите, есть и в руководстве РНР раздел посвященный этому. Ищите, читайте, но знать это нужно обязательно.
Последний раз редактировалось laimas, 22.09.2017 в 11:59.
|
|
22.09.2017, 11:51
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Булат Азат улы
|
С выводом файла пример понял. А как вывести обычное текстовое поле? Так:
basename($_POST['text'])
|
Нет, текст это текст, в нем нет путей и basename() тут не нужна, для текста нужен trim, ну и прочие проверки что определены сценарием/базой.
Последний раз редактировалось laimas, 22.09.2017 в 12:00.
|
|
|
|