Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 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:" и сразу переменная.
Помогите пожалуйста, как мне решить эту проблему?
Ответить с цитированием
  #2 (permalink)  
Старый 21.09.2017, 20:10
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от Булат Азат улы
А мне нужно, чтобы отправлять в одном случае - 2 изображения
А как пользователь сможет ввести два изображения?
Ответить с цитированием
  #3 (permalink)  
Старый 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>
Ответить с цитированием
  #4 (permalink)  
Старый 21.09.2017, 22:37
Профессор
Отправить личное сообщение для Rasy Посмотреть профиль Найти все сообщения от Rasy
 
Регистрация: 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>";
Ответить с цитированием
  #5 (permalink)  
Старый 21.09.2017, 23:53
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 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'])
Ответить с цитированием
  #6 (permalink)  
Старый 22.09.2017, 01:58
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 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.
Ответить с цитированием
  #7 (permalink)  
Старый 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'])

?
Ответить с цитированием
  #8 (permalink)  
Старый 22.09.2017, 11:50
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Булат Азат улы
Отправку multiple я сделать не смогу, так как каждое из двух изображений мне нужно по отдельности (первое изображение - оригинал, а второе - уменьшенный и облегченный его вариант (для сайта, после нажатия на него выйдет большой)). Поэтому, нужно определенно знать, какое изображение есть для чего.
Почему же нельзя, можно, просто серверный скрипт серьезнее будет. Ну может и два отдельных поля, это не так принципиально.

Сообщение от Булат Азат улы
А не могли бы сказать подробнее об этом?
basename($_FILES['file']['name'])
Все заголовки получаемые сервером на клиенте можно подделать, то есть вместо имени файла могут заказать "опасный" путь. Функция basename удаляет все, кроме имени файла. Это очень обширная тема "безопасность веб", затрагивающая многие аспекты, в сети ищите, есть и в руководстве РНР раздел посвященный этому. Ищите, читайте, но знать это нужно обязательно.

Последний раз редактировалось laimas, 22.09.2017 в 11:59.
Ответить с цитированием
  #9 (permalink)  
Старый 22.09.2017, 11:51
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Булат Азат улы
С выводом файла пример понял. А как вывести обычное текстовое поле? Так:
basename($_POST['text'])
Нет, текст это текст, в нем нет путей и basename() тут не нужна, для текста нужен trim, ну и прочие проверки что определены сценарием/базой.

Последний раз редактировалось laimas, 22.09.2017 в 12:00.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Раскрывающийся список с объемными текстами morzer Общие вопросы Javascript 4 11.07.2016 14:54
проблема со scroll Chrome Элементы интерфейса 2 21.10.2013 14:46
прогкрутка к якорям cOAPerator Общие вопросы Javascript 20 27.08.2013 03:30
Выравнять три дива в одной строке debugx (X)HTML/CSS 9 06.10.2011 12:03