Flashhilfe.de - Flash Community

Multiple File Upload IOError 2038 [Flash CS4]

 


AntwortenRegistrieren Seite1  

FLOschn#1
Benutzerbild von FLOschn
Beiträge: 4
Registriert: Nov 2009

18.11.2009, 12:02

Guten Tag!

1. Jap, ich habe viiiiel gegoogelt und auch hier im Forum gesucht.
2. Nein, meine Frage konnte nciht beantwortet werden.

3. Ich versuche mal, den Sachverhalt darzustellen. Ich habe mir einen Multi-File Uploader in Flash gebastelt, der eben den Filebrowser öffnet, man kann beliebig viele Dateien auswählen, und die sollten dann sequentiell und sortiert hochgeladen werden. Soweit ganz einfach. Ich gehe also in der Schleife über alle Items in der FileReferenceList drüber und starte den upload mittels item.upload("pfad zur php datei"). Das funktioniert soweit ja mal. Und jetzt kommt das abartige Verhalten: Nach einer willkürlichen Anzahl an Dateien, manchmal 20, manchmal 40, bekomme ich für alle folgenden Dateien die folgende Fehlermeldung:

[IOErrorEvent type="ioError" bubbles=false cancelable=false eventPhase=2 text="Error #2038"].

Diese Dateien findet man dementsprechend auch nicht auf dem Server. Alle Dateien bis zur ersten Fehlermeldung werden einwandfrei verarbeitet. Lokal kommt so was nicht vor.
Ich habe dann viel recherchiert und oft wird die das Modul mod_security dafür verantwortlich gemacht. Jedoch trat in den gefundenen Fällen diese Meldung IMMER auf, sprich: Der File-Upload kam nie zustande. Bei mir allerdings funktioniert er schon, allerdings nur bis zu einer gewissen Anzahl, die mir zum jetzigen Zeitpunkt noch willkürlich scheint. Es liegt jedenfalls nicht an der Anzahl und auch nicht an der gesamten Datenmenge. Egal ob die Dateien insgesamt 10 MB oder 400 KB haben, es kommt immer irgendwann mal die Fehlermeldung. Wenn ich jedes Mal das exakt gleiche Set an Dateien hochladen will, so variiert auch hier der Zeitpunkt des Fehlers. Manchmal nach 10 Dateien, manchmal erst nach 30. Und das FileUpload Limit liegt bei mir bei 25 MB, kanns aber auch nicht sein, hab ich getestet.

Weiters ist mir aufgefallen, dass die Dateien keineswegs in der Reihenfolge am Server landen, in der Sie in der FileReferenceList stehen. Manche Uploads gehen schneller, manche langsamer, und auch die Dateigrößen variieren ja.
Ich war ehrlich gesagt der Meinung, dass die Verarbeitung der Uploads so abläuft, dass der zweite Upload erst dann startet, sobald der erste fertig ist. Sprich: Die Schleife steht so lange, bis der Upload fertig ist und fährt dann mit dem nächsten Objekt fort. Dies ist offensichtlich nicht so. Ich habe mir mal in jedem Schleifendurchlauf den Dateinamen und die Laufvariable ausgeben lassen und festgestellt, dass die Schleife innerhalb kürzester Zeit durchlauft (unter einer Sekunde). Somit werden ja die ganzen Uploads nahezu zeitgleich abgefeuert.

- Kann es sein, dass der Server nicht zurechtkommt mit so einer Anfrage-Last?
- Wie kann man steuern, dass immer nur exakt ein Upload stattfindet, und erst wenn dieser fertig ist, der nächste, usw. !?
- Hat irgendwer eine andere Idee dazu?
- Weiter ist es so, dass die Verarbeitungsreihenfolge bei mir eine Rolle spielt. Die Bilder sollen exakt so, wie sie nach Dateinamen sortiert sind, auch wieder am Server landen, nur halt dann in schöner nummerierung (01.jpg, 02.jpg, ...). Nachdem einige Uploads irgendwie früher zu Ende sind als andere, sind die Bilder in einer wilden Reihenfolge am Server. Und ja, ich habe die FileReferenceList vorher sortiert ... ich denke es liegt an den unterschiedlichen Uploadzeiten o.ä.

So, das war jetzt ein Roman. Aber nachdem ich noch nirgendwo anders exakt diesen Problemfall gefunden habe, musste das sein.

Vielleicht hat ja jemand massiv Erfahrung mit der Thematik und kann mir einen kleinen Tip geben, mit dem ich das Ganze so umsetzen kann, sodass es auch wie gedacht arbeitet. Vielen Dank bereits im Voraus!
Werbung
Beiträge: 0
Registriert: Feb 2016


vindel#2
Benutzerbild von vindelFlashhilfe.de Moderator
Beiträge: 3000
Wohnort: Köln
Registriert: Oct 2007

18.11.2009, 12:27

Hallo,

lässt du Flash so viele Datein wie er Lusitg ist auf einmal hochladen, dann geht es nicht. Aus eigenen Erfahrungen kann ich dir sagen, dass Flash nicht mehr als 3-Datein sicher auf einmal hochladen kann. Ich habe das Problem so gelöst, dass er mit dem Download von Datei 1,2 &3 anfängt. Sobalt eine fertig ist, wird Datei 4 angefangen und so weiter. Also werden alle Datein nacheinander hochgeladen, aber halt nur immer maximal 3 auf einmal. Damit habe ich dann keine Probleme mehr gehabt.

Zu den Namen. Du hast ja dein PHP-Script, welches die Dateien umbenennen soll. Diesem gibst du beim Ausführen die Nummer des aktuellen Bildes mit. So hast du dann die Reihenfolge, die du in Flash auch hast und die Uploadzeit der einzelnen Datein und somit die Reihenfolge ist egal.

Ich hoffe, das hilft dir bei deinem Problem!
public Weltformel(Problem){
      if (Problem gelöst) return Lösung;
      else Weltformel(kleiners Problem);
}
springer#3
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

18.11.2009, 12:47

hi,
ich würde einzeln hochladen, und erst dann das nächste, dann kannst du auch allfällige fehler besser erkennen... und nicht in einer schleife hochladen, da der vorgang asynchron läuft. besser 1 datei hochladen, warten bis sie oben ist, dann die nächste... usw...
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
FLOschn#4
Benutzerbild von FLOschn
Beiträge: 4
Registriert: Nov 2009

Themenautor/in

18.11.2009, 12:59

Danke mal für die Beiträge.

Gegenfrage: Was meint ihr mit "einzeln" hochladen!? Soll der Benutzer eine Datei wählen, hochladen per Click, dann wieder neue auswählen und hochladen usw. !? Wenn ihr das meint: Das will ich definitiv nicht.

Was ich will ist: Der Benutzer soll sich über den Browser von mir aus 200 Dateien auswählen können und mit einem Klick soll der Vorgang gestartet werden. Der Benutzer muss sich dann um nichts mehr kümmern.

Tja, soweit so gut... ich habe also diese Liste voll mit FileReference Items. Wie kann ich die anders abarbeiten als mit einer Schleife? Oder gibt es einen Weg, die Schleife so lange anzuhalten, bis der aktuelle Upload fertig ist!? Vielleicht ist es ja wirklich dieser Ansturm auf den Server, der den Fehler verursacht!? Denn wie gesagt werden die Uploads alle in kürzester Zeit gestartet...

Any suggetsions? Oder einen Code-Fetzen!?
Werbung
Beiträge: 0
Registriert: Feb 2016


springer#5
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

18.11.2009, 13:02

ja, das ist schon so gemeint, dass der user 200 files auswählen kann.... aber schön nacheinander werden die hochgeladen, dann klappts auch....
item 1 aus filereferncelist hochladen, warten bis es hochgeladen wurde, item 2 aus filereferencelist hochladen, warten bis es hochgeladen wurden, item 3......
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
FLOschn#6
Benutzerbild von FLOschn
Beiträge: 4
Registriert: Nov 2009

Themenautor/in

19.11.2009, 10:11

Sooo. Hatte gestern leider keine Zeit mehr zum antworten. Also das Prinzip versteh ich ja, nur wie setze ich das um, sodass wirklich die Uploads sequentiell abgefeuert werden (sprich: ein Upload nach dem anderen, allerdings nicht parallel)?

Hier ist mal der Code, so wie ich es aktuell realisiert habe:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// Upload Funktion
function onMouseDownUploadFunc(e : MouseEvent) : void {
   
   var list : Array = fileRef.fileList;
   
   // Liste sortieren!
   list.sortOn("name", Array.NUMERIC);
   
   if(list != null){
      if(list.length > 0){
         var item : FileReference;
         LogWindow.appendText("Uploading...n");
         for(var i:Number = 0; i < list.length; i++) {
            item = list[i];
            
            // Überprüfung auf gültige File-Typen
            if(item.type == ".jpg" || item.type == ".JPG" || item.type == ".jpeg" || item.type == ".JPEG" || item.type == ".gif" || item.type == ".GIF" || item.type == ".png" ||item.type == ".PNG"){     
               
               // Button disablen!
               uploadButton_btn.visible = false;
               
               
               var galleryID : Number;
               if((LoaderInfo(this.root.loaderInfo).parameters["galleryID"] != null) && (LoaderInfo(this.root.loaderInfo).parameters["galleryID"] != undefined)){
                  this.galleryID = Number(LoaderInfo(this.root.loaderInfo).parameters["galleryID"]);
               }else{
                  this.galleryID = 0;
               }
               
               
               // Alle Eventlistener anmelden
               item.addEventListener(ProgressEvent.PROGRESS, progressFunc);
               item.addEventListener(Event.COMPLETE, uploadComplete);
               item.addEventListener(Event.CANCEL, cancelFunc); // wenn User FileBrowser neu aufruft
               item.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpErrorFunc);  // Fehler
               item.addEventListener(IOErrorEvent.IO_ERROR, ioErrorFunc);
               item.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorFunc);
               
               item.upload(new URLRequest("pfad//upload_picture.php?id=" + this.galleryID));
            }else{
               LogWindow.appendText("Error! Image " + item.name + " is no allowed image format!n");
            }
         }
      }else{
         LogWindow.text = ("Error! You have to choose some images for upload!n");
      }
   }else{
      LogWindow.text = ("Error! You have to choose some images for upload!n");
   }
}



Für eine Anregung oder einen Code-Ausschnitt wäre ich sehr sehr sehr froh...
springer#7
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

19.11.2009, 10:31

mal so im groben:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
private var fileReferenceList:FileReferenceList;
private var fileList:Array;
private var currentFileIndex:int = 0;
      
// dateien auswählen
private function browse():void
{
   this.fileReferenceList = new FileReferenceList();
   this.fileReferenceList.addEventListener(Event.SELECT,fileSelected);
   this.fileReferenceList.browse();
}
// upload starten
private function fileSelected(event:Event):void
{
   this.uploadNextFile();
}
         
// lädt das nächste file hoch
private function uploadNextFile():void
{
   if(this.currentFileIndex < this.fileReferenceList.fileList.length)
   {               
      var url:String = "upload.php"; // url zu deinem uploadscript
      var req:URLRequest = new URLRequest(url);
      req.method = URLRequestMethod.POST;
         
      var file:FileReference = this.fileReferenceList.fileList[this.currentFileIndex];
      file.upload(req,"file",false);
      file.addEventListener(Event.COMPLETE, onUploadComplete);
   }else{
      trace("all files uploaded")
      this.currentFileIndex = 0;
   }
}

// file ist hochgeladen, nächstes file hochladen
private function onUploadComplete(event:Event):void
{
   trace("upload_complete",event.toString())
   this.currentFileIndex++;
   this.uploadNextFile();
}


ps: bei browse() kannst du noch einen filter als parameter angeben:

ActionScript:
1
2
var f:FileFilter = new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)","*.jpg;*.jpeg;*.gif;*.png");
this.fileReferenceList.browse(<b>);


damit kannst du dir deinen filetypechecker sparen... ;-)

an stelle von <b> sollte natürlich ein "f" in eckigen klammern stehen... ;-)
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
FLOschn#8
Benutzerbild von FLOschn
Beiträge: 4
Registriert: Nov 2009

Themenautor/in

15.12.2009, 12:15

ok. warum ich so lange nicht gecshrieben habe: man kommt einfach zu NICHTS! und jetzt auch noch die weihnachtszeit....

auf jeden fall wollte ich schonmal danke sagen für die tips. Ich habe bis jetzt nur kurz mal angefangen mich damit zu spielen, hatte aber noch keine zeit, um mich mal in ruhe eine oder zwei stunden damit zu befassen. feedback/fragen kommen wieder hier rein, wenn ich fertig bin / wiedermal anstehe ;)

danke trotzdem für den coolen leitfaden! werd den code irgendwie einbauen bei mir und wenns funzt kann ich das ganze gerne auch zur verfügung stellen.

lg, f
palpalo#9
Benutzerbild von palpalo
Beiträge: 17
Registriert: May 2006

23.10.2010, 16:44

super gute ding

wie könnte der code in as2 aussehen? habs leider nur flash 8.
palpalo#10
Benutzerbild von palpalo
Beiträge: 17
Registriert: May 2006

04.11.2010, 10:52

ich habe der beispiel in der flash hilfe mir angeschaut

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import flash.net.FileReferenceList;
import flash.net.FileReference;

var listener:Object = new Object();

listener.onSelect = function(fileRefList:FileReferenceList) {
      trace("onSelect");
      var list:Array = fileRefList.fileList;
      var item:FileReference;
      for(var i:Number = 0; i < list.length; i++) {
          item = list[i];
          trace("name: " + item.name);
          trace(item.addListener(this));
          item.upload("http://www.yourdomain.com/");
      }
}

listener.onCancel = function():Void {
      trace("onCancel");
}

listener.onOpen = function(file:FileReference):Void {
      trace("onOpen: " + file.name);
}

listener.onProgress = function(file:FileReference, bytesLoaded:Number, bytesTotal:Number):Void {
      trace("onProgress with bytesLoaded: " + bytesLoaded + " bytesTotal: " + bytesTotal);
}

listener.onComplete = function(file:FileReference):Void {
      trace("onComplete: " + file.name);
}

listener.onHTTPError = function(file:FileReference, httpError:Number):Void {
      trace("onHTTPError: " + file.name + " httpError: " + httpError);
}

listener.onIOError = function(file:FileReference):Void {
      trace("onIOError: " + file.name);
}

listener.onSecurityError = function(file:FileReference, errorString:String):Void {
      trace("onSecurityError: " + file.name + " errorString: " + errorString);
}

var fileRef:FileReferenceList = new FileReferenceList();
fileRef.addListener(listener);
fileRef.browse();



so weit klappt es auch alles, wie mache aber jetze, wenn der user mehr als 3 dateien gewählt hat, dass auch die files 4,5, ect. sicher uploaded wird.

bitte um ratschäge
tobi-848#11
Benutzerbild von tobi-848
Beiträge: 43
Wohnort: Schweiz
Registriert: Oct 2010

23.03.2011, 17:23

Hallo

Hier gibt es einen Multiuploader zum herunterladen.

Vielleicht hilft es dir weiter.

http://tobias-ernst.ch/flash.html

Gruss

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2019 Sebastian Wichmann - Flashhilfe.de