Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.10.2015, 23:36
Новичок на форуме
Отправить личное сообщение для Виктop Посмотреть профиль Найти все сообщения от Виктop
 
Регистрация: 24.10.2015
Сообщений: 2

отправление файла XMLHttpRequest()
Всем здрасти, пытаюсь отправить файл на сервер не перезагружая страницы, получаю от сервера ответ: ответ получен
Notice: Array to string conversion in /home/server/test/test.php on line 9 img=Array, но файл не загружается на сервер, на всякий случай приложу файл.php, хотя к нему вопросов нет, с обычной html формы он файл сохраняет, проблема в скрипте, скорее всего в отправляемых заголовках
<?php
ini_set("display_errors", "1");
error_reporting(E_ALL);
move_uploaded_file($_FILES['img']['tmp_name'], "/home/uf/".$_FILES['img']['name']);
echo "ответ получен";
$arr=array();
$arr=$_FILES;
foreach ($arr as $key => $value) {
   echo "$key".'='."$value";
}
?>

<form name="form1" enctype="multipart/form-data">
  <input type="file" name="img" id="img" />
  <br />
  <input type="button" value="Отправить" onclick="upload(form1)" />
  <p>Ответ: <span id="res"></span></p>
</div>
<script type="text/javascript">
function upload(form1)
	{
	var form = document.form1;
	var img = form.img.value;
	var boundary = String(Math.random()).slice(2);
	var file = ['\r\n--'+boundary+'\r\nContent-Disposition: form-data; name="img"; filename="image.jpg"\r\nContent-Type: image/jpeg\r\n\r\n'+img+'\r\n --'+boundary+'--\r\n'];
    var xmlhttp = new XMLHttpRequest(); // Создаём объект XMLHTTP
    xmlhttp.open('POST', 'test.php', true); // Открываем асинхронное соединение
    xmlhttp.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary); // Отправляем кодировку
    xmlhttp.send(file); // Отправляем POST-запрос
    xmlhttp.onreadystatechange = function() // Ждём ответа от сервера
		{
		if (xmlhttp.readyState == 4) // Ответ пришёл
			{
			if(xmlhttp.status == 200) // Сервер вернул код 200 (что хорошо)
				{
				document.getElementById("res").innerHTML = xmlhttp.responseText; // Ответ сервера
				}
			}
		}
	}
</script>

Последний раз редактировалось Виктop, 25.10.2015 в 03:14.
Ответить с цитированием
  #2 (permalink)  
Старый 25.10.2015, 06:17
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

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

Код серверный это абракадабра полная. Загрузка файлов на сервере, если говорить о полном процессе, начинается с проверки не пуст ли массив FILES, если нет, проверяются ошибки загрузки его ключа "error", если есть ошибки то действия определенные сценарием - или прекращение загрузки и возврат ошибок клиенту, либо перемещение в каталог загруженных, и сообщить клиенту о тех что не загружены, в случае загрузки нескольких файлов.

Если нет ошибок и есть что помещать в каталог, этому каталогу устанавливаются права 0777 (после загрузки вновь по умолчанию - 0755) и только затем в цикле если файлов несколько, или сразу если файл один функцией move_uploaded_file перемещают загруженный файл в каталог. Только нельзя брать непосредственно имя файла, что содержится в ключе "name", нужно из него брать только имя файла basename(), так как этот ключ может содержать и путь, который можно подставить. В каталоге, в который производится загрузка, должно быть запрещено выполнение любых скриптов и исполняемых файлов.

На клиенте "// Сервер вернул код 200 (что хорошо)" еще не означает, что все хорошо, это всего лишь ответ сервера что "созвонились". О загрузке на клиенте:
https://learn.javascript.ru/xhr-forms
http://habrahabr.ru/post/120917/
Ответить с цитированием
  #3 (permalink)  
Старый 25.10.2015, 13:14
Новичок на форуме
Отправить личное сообщение для Виктop Посмотреть профиль Найти все сообщения от Виктop
 
Регистрация: 24.10.2015
Сообщений: 2

Спасибо Вам за попытку помочь, но вообще ни о чём, во первых я уже писал что к файл.php вопросов нет, ни о какой безопасности там речи вообще не идёт, он создан только для теста и его задача тупо сохранить изображение, отчитаться о получении запроса, что он успешно делает при отправке обычной html формы, что в свою очередь говорит о том, что с ним всё норм, проблема в клиенте, от что он выдаёт ответ: "ответ получен", это говорит о том, что скрипт отправляет запрос к файл.php, но загрузки файла не происходит, в этом то и весь вопрос
Ответить с цитированием
  #4 (permalink)  
Старый 25.10.2015, 13:24
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Виктop
что в свою очередь говорит о том, что с ним всё норм, проблема в клиенте, от что он выдаёт ответ: "ответ получен"

Даже так?! Ну тогда успехов в загрузке файлов, только замечу, что

move_uploaded_file($_FILES['img']['tmp_name'], "/home/uf/".$_FILES['img']['name']);

а затем

$arr=$_FILES;
foreach ($arr as $key => $value)

это дурь несусветная. Читайте сперва здесь, и это только минимум, которого у вас и близко нет, а уж затем утверждайте о своей правоте.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как изменить имя скачиваемого файла? Dimaz Общие вопросы Javascript 4 13.09.2014 16:25
XMLHttpRequest передача массива серверу JaneLane AJAX и COMET 5 16.05.2014 12:09
запрос на другой сайт XMLHttpRequest vscorpion Internet Explorer 9 24.12.2013 16:46
xmlHttpRequest подскажите czp AJAX и COMET 4 10.12.2012 23:23
XMLHttpRequest status=0, хотя запрос проходит. arigasa AJAX и COMET 4 15.02.2011 20:14