1. grechan - 01 Декабря, 2012 - 00:58:35 - перейти к сообщению
После отправки файла (изображения) аяксом пытаюсь создать изображение через imagecreatefromjpeg. Файл точно загружается но изображение не создаётся. Позже понял, что на сервер оно приходит в виде бинарной строки. можно ли средствами пхп преобразовать бинарную строку до такого вида, чтобы изображение можно было создать imagecreatefromjpeg? Или может быть есть возможность получить изображение напрямую из бинарного потока? Файл формируется filereader-ом. Или искать пути решения на стороне клиента?
2. sKaa - 01 Декабря, 2012 - 01:17:35 - перейти к сообщению
Ajax в принципе не способен отправлять файлы! У вас проблема в чём-то другом. Код в студию.
3. grechan - 01 Декабря, 2012 - 01:42:13 - перейти к сообщению
Вот этим отправляю
CODE (javascript):
скопировать код в буфер обмена
скопировать код в буфер обмена
- function uploadFile(file, url) {
- var reader = new FileReader();
- reader.onload = function() {
- var xhr = new XMLHttpRequest();
- xhr.upload.addEventListener("progress", function(e) {
- if (e.lengthComputable) {
- var progress = (e.loaded * 100) / e.total;
- /* ... обновляем инфу о процессе загрузки ... */
- }
- }, false);
- if (!XMLHttpRequest.prototype.sendAsBinary) {
- XMLHttpRequest.prototype.sendAsBinary = function(datastr) {
- function byteValue(x) {
- return x.charCodeAt(0) & 0xff;
- }
- var ords = Array.prototype.map.call(datastr, byteValue);
- var ui8a = new Uint8Array(ords);
- this.send(ui8a.buffer);
- }
- }
- /* ... можно обрабатывать еще события load и error объекта xhr.upload ... */
- xhr.onreadystatechange = function () {
- if (this.readyState == 4) {
- if(this.status == 200) {
- document.getElementById("status").innerHTML=xhr.responseText;
- /* ... все ок! смотрим в this.responseText ... */
- } else {
- /* ... ошибка! ... */
- }
- }
- };
- xhr.open("POST", url);
- var boundary = "xxxxxxxxx";
- // Устанавливаем заголовки
- xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary="+boundary);
- xhr.setRequestHeader("Cache-Control", "no-cache");
- // Формируем тело запроса
- var body = "--" + boundary + "\r\n";
- body += "Content-Disposition: form-data; name='myFile'; filename='" + file.name + "'\r\n";
- body += "Content-Type: application/octet-stream\r\n\r\n";
- body += reader.result + "\r\n";
- body += "--" + boundary + "--";
- xhr.send(body);
- /*if(xhr.sendAsBinary) {
- // только для firefox
- xhr.sendAsBinary(body);
- } else {
- // chrome (так гласит спецификация W3C)
- xhr.send(body);
- }*/
- };
- // Читаем файл
- reader.readAsBinaryString(file);
- }
- uploadAll.onclick=function()
- {
- var list=document.getElementsByTagName('LI')[0];
- uploadFile(list.file, "ajax.php");
- }
, а вот этим обрабатываю
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- <?PHP
- $error = $_FILES['file']['error'];
- switch($error) {
- case 0 :
- $error = 'файл загружен';
- break;
- case 1 : case 2 :
- $error = 'слишком большой файл';
- break;
- case 3 :
- $error = 'файл загружен частично';
- break;
- case 4 :
- $error = 'файл не был загружен';
- }
- echo $error.'</br>';
- if (!$im) echo 'дело дрянь </br>';
- $newx_b = $imx; //ширина
- $newy_b = $imy; //высота
- $folder = $_SERVER['DOCUMENT_ROOT'].'/temp/';
- $file_name = $_FILES['myFile']['name'];
- $canvas_b = imagecreatetruecolor($newx_b, $newy_b);//новая чистая картинка (imagecreate, imagecreatetruecolor)
- imagecopyresampled($canvas_b, $im, 0, 0, 0, 0, $newx_b, $newy_b, $imx, $imy);//наложение изображений (imagecopy, imagecopyresized, imagecopyresampled)
- //**************************************************************************************************
- //Записываем файл
- //**************************************************************************************************
- if ($result==true)
- {
- echo 'Файл записан';
- }
- else
- {
- echo 'Файл не записан';
- }
- ?>