01.02.2014, 22:53
|
Интересующийся
|
|
Регистрация: 29.09.2010
Сообщений: 20
|
|
Передача картинки javascript
Передача картинки javascriptЗадача из html страницы необходимо передать картинку в php файл и обратно получить текстовые данные. У меня есть форма, в которой присутствует тег <input type="file">, в который я вставляю картинку. Необходимо без перезагрузки страницы, передать картинку в php файл и получить в виде глобальной переменной $_FILE. Далее обработать и передать обратно имя картинки и т.д. Вся проблема, что у меня не получается передать сам файл в php. Пробую путём создания XMLHttpRequest и отсылаю методом POST. Если кто сталкивался помогите примером.
Заранее спасибо.
|
|
01.02.2014, 23:51
|
Новичок на форуме
|
|
Регистрация: 01.02.2014
Сообщений: 5
|
|
|
|
02.02.2014, 01:38
|
Интересующийся
|
|
Регистрация: 29.09.2010
Сообщений: 20
|
|
Данным способом уже пробовал.
форма
<input type="file" id="uploadfile" name="uploadfile" onchange="insertim_img();" />
скрипт
<script>
var client = new XMLHttpRequest();
function insertim_img()
{
var file = document.getElementById("uploadfile");
/* Create a FormData instance */
var formData = new FormData();
/* Add the file */
formData.append("upload", file.files[0]);
client.open("post", "/adds/insert_img.php", true);
client.setRequestHeader("Content-Type", "multipart/form-data");
client.send(formData); /* Send to server */
}
/* Check the response status */
client.onreadystatechange = function()
{
if (client.readyState == 4 && client.status == 200)
{
alert(client.statusText);
}
}
</script>
php файл
<?php
$image=$_FILES['upload']['name'];
if ($image)
{
$filename = stripslashes($_FILES['upload']['name']);
$extension = pathinfo($filename, PATHINFO_EXTENSION);
$extension = strtolower($extension);
if (($extension != "jpg") && ($extension != "jpeg") && ($extension != "png") && ($extension != "gif"))
{
echo 'Неверный формат файла...';
}
else
{
$size=filesize($_FILES['upload']['tmp_name']);
if ($size > 3145728)
{
echo 'Размер файла больше <b>3</b>Mb <br/>';
}
$image_name=trans($title).'.'.$extension;
$newname=$_SERVER['DOCUMENT_ROOT']."/img/".$image_name;
$copied = copy($_FILES['upload']['tmp_name'], $newname);
}}
?>
Не работает, в хроме можно ошибки посмотреть. Вот скриншот
|
|
02.02.2014, 12:36
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Попробуйте в другом браузере. И первым делом следует проверить канал как таковой, прежде чем файло закачивать. Что приходит на сервер, что получает браузер и все такое.
Кстати, не замечено в вашем процессинге сообщений об успехе мероприятия. Только насчет обломов есть эхо.
|
|
02.02.2014, 15:29
|
Интересующийся
|
|
Регистрация: 29.09.2010
Сообщений: 20
|
|
Код должен быть универсальным, то есть работать в любом браузере, потому что смысла в нем не будет. Может есть возможность по другому решить данную задачу? Это банальная функция отправки картинки без перезагрузки браузера. Как на авито - добавляешь объявление, выбираешь картинку, она загружается на сервер и выводится миниатюра! У меня проблема в передаче на пхп файл.
|
|
03.02.2014, 00:21
|
Интересующийся
|
|
Регистрация: 29.09.2010
Сообщений: 20
|
|
Кое как смог передать через данную функцию файл на пхп обработку. Только теперь не могу принять в пхп. Запускаю функцию print_r($GLOBALS); и выводит что то подобное
[SERVER_SOFTWARE] => Apache/2.2.25-3-beget (Unix) [SERVER_NAME] => ***.com [SERVER_ADDR] => *** [SERVER_PORT] => 80 [REMOTE_ADDR] => *** [DOCUMENT_ROOT] => ***/public_html [SERVER_ADMIN] => webmaster@***.com [SCRIPT_FILENAME] => ***/public_html/insert_img.php [REMOTE_PORT] => 54693 [GATEWAY_INTERFACE] => CGI/1.1 [SERVER_PROTOCOL] => HTTP/1.0 [REQUEST_METHOD] => POST [QUERY_STRING] => [REQUEST_URI] => /insert_img.php [SCRIPT_NAME] => /insert_img.php [PHP_SELF] => /insert_img.php [REQUEST_TIME] => 1391371961 [argv] => Array ( ) [argc] => 0 ) [_FILES] => Array ( ) [HTTP_POST_FILES] => Array ( ) [_REQUEST] => Array ( [PHPSESSID] => 415f92b9d70fa1e213f9114df8133203 ) )
Получается передаю методом пост, а это переменная пуста. $_FILES тоже пуста. Смог кое как посмотреть что файл передается функцией
$data=file_get_contents('php://input');
// print_r($data);
там выводится имя файла, метод передачи формы multipart/form-data; и огромное количество иероглифов(я предполагаю сама картинка), что мне дальше делать?
|
|
03.02.2014, 05:54
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Делайте вот что: читайте что вам пишут веря в то, что пишут не от балды как вы привыкли не читать что пишут.
Я вам предложил проверить канал, это значит в файле /adds/insert_img.php надо сделать вот что
<?php
die("I have heard");
// тут остальная тряхомудия файла
Это значит что скрипт мгновенно сдохнет как только запустится, но выдаст в буфер фразу I have heard (Я услышал) которую вам надо вывести в консоль через ту самую функцию которая висит на событии ответа сервера
client.onreadystatechange = function() {
console.log(client.responseText)
}
Кнопки-файлы - все остается, и файлы могут на сервер уходить, но вы их не трогаете и не ищите не обрабатываете (они сами удалятся после die() из темпа), а просто смотрите в браузере, в консоли что ответил сервер.
Таким образом после нажатия Отправить или что у вас там, в консоли должен появиться текст: I have heard.
|
|
03.02.2014, 06:04
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Появился? Теперь проверяете отправку файлов. Которая делается вот так
<?php
print_r($_FILES);
die(); // "I have heard" - удалите
В консоли браузера должен появится текст показывающий значение переменной $_FILES, а оно - если переменная не пустая - массив, который print_r() покажет красиво, с переносами (поэтому в браузер особого смысла выводить нет - красиво не будет).
Увидев что в $_FILES вы поймете что делать дальше. Структра $_FILES - табличная. То есть на каждый файл несколько полей. Начинают как правило с поля error, по значению которого можно судить об успешности загрузки файла. Если там 0 - загрузился и значит можно обрабатывать. Значения кодов ошибок
Код:
|
$err_msg = array(
1=>'Размер закачанного файла превышает upload_max_filesize как определено в php.ini',
2=>'Размер закачанного файла превышает значение MAX_FILE_SIZE как определено в HTML форме',
3=>'Файл закачался не полностью',
4=>'Не был выбран файл для закачки',
6=>'Не найдена папка временного хранения файлов на сервере',
8=>'Недопустимые символы в имени файла. Допускаются "-", цифры: 0-9, буквы: A-Z и "_"',
9=>'Недопустимая длина имени файла (макcимум 225 символов)'
); |
8 и 9 - это мои собственные коды.
|
|
03.02.2014, 07:36
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Кстати вот страница с тем самым примером откуда вы сырец сперли: http://download.tizen.org/misc/examp...el_2/xhr1.html
Процессинга там нет, выдает 404, но отправка работает, можете сравнить заголовки с тем что выдает ваш скрипт и оригинальный.
И насчет других браузеров. Чтобы во всех браузерах поведение вашей апликухи было одинаковым придется изучать поведение всех браузеров и внедрять в апликуху таблетки от девиаций.
Например ФФ выдает значение кнопки файл как файл, а Хром выдает с какой-то байдой, которую еще отрезать надо.
|
|
03.02.2014, 12:33
|
Интересующийся
|
|
Регистрация: 29.09.2010
Сообщений: 20
|
|
Я написал что $_FILES пуст. я пробовал print_r($_FILES); и print_r($_POST); тут тоже пусто. Выводит Array(а тут ничего, пустота).
|
|
|
|