PDA

Просмотр полной версии : IO error при загрузке фоток


Beckie
02.03.2010, 03:27
Собственно проблема следующая.

Если загружаю маленькие фотографии(до 100кб), то загружаются без проблем, если больше 100кб, то уже не грузит и почти под конец загрузки в actionscripted срабатывает
fileListener.onIOError = function(file:FileReference):Void
{
getURL("Javascript:io_error();");
}

У меня uploading канал 40kb/sec. На локальном сервере грузятся фотки любого размера.

У друга uploading канал 8mbit/sec, грузятся фотки нормально, даже 3.2mb фотки без IOerror.

Смотрел за процессом загрузки через debuggin proxy прогу, она показывает в момент IOerror, что статус Completed, а Request Header не прилетел вообще.

Но самый прикол в том, что если я ограничиваю свой интернет через Netlimiter до 20kb/sec, то фотки грузятся нормально.


Вот код actionscript:

System.security.allowDomain("http://" + _root.tdomain + "/");
import flash.net.FileReferenceList;
import flash.net.FileReference;
import flash.external.ExternalInterface;
import flash.external.*;

/* Main variables */
var session_photos = _root.ph;
var how_much_you_can_upload = 0;

var selected_photos; // container for selected photos
var inside_photo_num = 0; // for photo in_array selection
var created_elements = _root.ph;
var for_js_num = _root.ph;




/* Functions & settings for javascript<->flash conversation */
var methodName:String = "addtoflash";
var instance:Object = null;
var method:Function = addnewphotonumber;
var wasSuccessful:Boolean = ExternalInterface.addCallback(methodName, instance, method);
function addnewphotonumber() {
session_photos--;
created_elements--;
for_js_num--;
}

/* Javascript hide and show flash button functions */
function block(){getURL("Javascript: blocking();");}
function unblock(){getURL("Javascript:unblocking();");}

/* Creating HTML platform function */
var result = false;




/* Uploading */
function uploadthis(photos:Array) {

if(!photos[inside_photo_num].upload("http://" + _root.tdomain + "/upload.php?PHPSESSID=" + _root.phpsessionid))
{
getURL("Javascript:error_uploading();");
}
}




/* Flash button(applet) options and bindings */
var fileTypes:Array = new Array();
var imageTypes:Object = new Object();
imageTypes.description = "Images (*.jpg)";
imageTypes.extension = "*.jpg;";
fileTypes.push(imageTypes);

var fileListener:Object = new Object();
var btnListener:Object = new Object();
btnListener.click = function(eventObj:Object)
{
var fileRef:FileReferenceList = new FileReferenceList();
fileRef.addListener(fileListener);
fileRef.browse(fileTypes);
}
uploadButton.addEventListener("click", btnListener);














/* Listeners */
fileListener.onSelect = function(fileRefList:FileReferenceList):Void
{
// reseting values
inside_photo_num = 0;

var list:Array = fileRefList.fileList;
var item:FileReference;

// PHP photo counter
how_much_you_can_upload = 3 - session_photos;

if(list.length > how_much_you_can_upload)
{
getURL("Javascript:howmuch=" + how_much_you_can_upload + ";list_length=" + list.length + ";limit_reached();");
return;
}

// if session variable isn't yet refreshed, we check inner counter
if(created_elements >= 3)
{
getURL("Javascript:limit_reached();");
return;
}

selected_photos = list;

for(var i:Number = 0; i < list.length; i++)
{
how_much_you_can_upload--;
item = list[i];
trace("name: " + item.name);
trace(item.addListener(this));
if((item.size / 1024) > 5000) {getURL("Javascript:size_limit_reached();");return;}
}

result = false;
setTimeout(block,500);

/* Increment number for new HTML container and pass it to javascript, after javascript returns true and we start uploading */
for_js_num++;
if(ExternalInterface.call("create_platform",for_js_num))
{
uploadthis(selected_photos);
}




}


fileListener.onProgress = function(file:FileReference, bytesLoaded:Number, bytesTotal:Number):Void
{
getURL("Javascript:files_process(" + bytesLoaded + "," + bytesTotal + "," + for_js_num + ");");
}

fileListener.onComplete = function(file:FileReference, bytesLoaded:Number, bytesTotal:Number):Void
{
inside_photo_num++;

var sendvar_lv:LoadVars = new LoadVars();
var loadvar_lv:LoadVars = new LoadVars();
loadvar_lv.onLoad = function(success:Boolean){

if(loadvar_lv.failed == 1) {
getURL("Javascript:type_failed();");
return;
}

getURL("Javascript:filelinks='" + loadvar_lv.json + "';fullname='" + loadvar_lv.fullname + "';completed(" + for_js_num + ");");

created_elements++;

if((inside_photo_num + 1) > selected_photos.length) {setTimeout(unblock,1000);return;} // don't create empty containers anymore
if(created_elements >= 3) {return;}

result = false;

/* Increment number for new HTML container and pass it to javascript, after javascript returns true and we start uploading */
for_js_num++;
if(ExternalInterface.call("create_platform",for_js_num))
{
uploadthis(selected_photos);
}
}
sendvar_lv.getnum = true;
sendvar_lv.PHPSESSID = _root.phpsessionid;
sendvar_lv.sendAndLoad("http://" + _root.tdomain + "/upload.php",loadvar_lv,"POST");

}








fileListener.onCancel = function(file:FileReference):Void
{
}

fileListener.onOpen = function(file:FileReference):Void
{
}

fileListener.onHTTPError = function(file:FileReference, httpError:Number):Void
{
getURL("Javascript:http_error(" + httpError + ");");
}

fileListener.onSecurityError = function(file:FileReference, errorString:String):Void
{
getURL("Javascript:security_error(" + errorString + ");");
}

fileListener.onIOError = function(file:FileReference):Void
{
getURL("Javascript:io_error();");

}


<OBJECT classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,115,0" width="100" height="22" id="fileref" align="middle">
<PARAM name="allowScriptAccess" value="always">
<PARAM name="swliveconnect" value="true">
<PARAM name="movie" value="http://www.hosthere.com/fileref.swf?ph=-1&phpsessionid=8mirsjsd75v6vk583vkus50qbb2djsp6&tdomain=www.hosthere.com">
<PARAM name="wmode" value="opaque">
<PARAM name="quality" value="high">
<PARAM name="bgcolor" value="#ffffff">
<EMBED swliveconnect="true" wmode="opaque" src="http://www.hosthere.com/fileref.swf?ph=-1&phpsessionid=8mirsjsd75v6vk583vkus50qbb2djsp6&tdomain=www.hosthere.com" quality="high" bgcolor="#ffffff" width="100" height="22" name="fileref" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"></EMBED>
</OBJECT>




Вот что удалось нарыть, это успешный вариант загрузки маленькой фотки через тот proxy debugger:

http://i192.photobucket.com/albums/z228/Somebi/wtf1.gif
http://i192.photobucket.com/albums/z228/Somebi/wtf2.gif
http://i192.photobucket.com/albums/z228/Somebi/wtf3.gif

Шапка 200 прилетает, все ок, загрузка успешная, ссылка вернулась, картинка загрузилась.



Грузим 3.2mb фотку:

http://i192.photobucket.com/albums/z228/Somebi/un-wtf1.gif
http://i192.photobucket.com/albums/z228/Somebi/un-wtf2.gif

Вкладка ответа пустая, ответ не прилетел, естественно шапка тоже.

Вот что удалось залогить в upload.php:


$_SERVER['CONTENT_LENGTH'] -> 54

$_FILES['Filedata']:

FILE name: [name] [8] Undefined index: Filedata
FILE type: [type] [8] Undefined index: Filedata
FILE tmp_name: [tmp_name] [8] Undefined index: Filedata
FILE error: [error] [8] Undefined index: Filedata

Других ошибок не залогилось.

Что это за мистика такая и как с ней бороться?

zurkis
02.03.2010, 03:37
можно попробовать проверить права доступа на папку в которую фотки загружаются

Beckie
02.03.2010, 04:57
Дык фотографии загружаются раз через раз, если было бы дело в этом, тогда бы вообще не загружались бы.

Не?

Добавлено через 8 часов 40 минут
Неужели никто не встречался с подобной проблемой?

Хоть какие-нибудь способы решения этой проблемы.

Могу описать, как работает скрипт досконально, поэтапно.

Но проблему надо решить в любом случае.

Кстати чем можно посмотреть весь процесс загрузки фотографии на сервер?

А то в этом web proxy debugger маловато информации.

Меня кстати очень сильно смущает тот факт, что ответа от сервера не поступает. Что тогда выступает в роли триггера за статус Completed?

Добавлено через 8 часов 42 минуты
Может стоит переписать скрипт на AS3, но вот как именно я не знаю.

Еще вариант перейти на flex?

Добавлено через 9 часов 54 минуты
Кстати, как поменять Request Headers в Actionscript?

Добавлено через 10 часов 10 минут
POST http://www.hosthere.com/upload.php?PHPSESSID=d9tmofqfsb0i2m0gnord54icbivuh5h2 HTTP/1.1
Accept: text/*
Content-Type: multipart/form-data; boundary=----------KM7cH2Ij5Ij5Ef1gL6GI3GI3Ij5KM7
User-Agent: Shockwave Flash
Host: www.hosthere.com
Content-Length: 3290117
Connection: Keep-Alive
Pragma: no-cache

------------KM7cH2Ij5Ij5Ef1gL6GI3GI3Ij5KM7
Content-Disposition: form-data; name="Filename"

PICT5308.JPG
------------KM7cH2Ij5Ij5Ef1gL6GI3GI3Ij5KM7
Content-Disposition: form-data; name="Filedata"; filename="PICT5308.JPG"
Content-Type: application/octet-stream

Добавлено через 10 часов 45 минут
Иногда сразу, а иногда через 2 минуты получаю таки овтет от сервера в виде Header 504.

Добавлено через 12 часов 2 минуты
Странно, но через локальный проки фотки грузятся на ура, только вырубаю проксик, сразу не грузятся.

Добавлено через 38 часов 19 минут
Мне тут сказали, что это может быть из-за буффера. Мол у кого большая скорость uploading, то флеш прямиком без буффера грузит на сервер, а если маленькая, то грузит в буффер. Вот в буффере и происходит ошибка.

Может кто-то поподробнее об этом написать?