Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    714

    [F8] FileReferenceList: domanda per espertoni

    Utilizzo FileReferenceList per uplodare sul server delle foto ma prima di passare i files all'upload eseguo dei controlli sulla dimensione e sull'estensione dei files.

    Tutto procede correttamente con connessioni lente ma quando passo a connessioni elevate (adsl 6/20 mega o cablati) la procedura diventa asincrona e mi vengono caricati meno file.

    Capita, per esempio, che se seleziono 20 file me ne trovo solo 19 sul server!

    Oltretutto la procedura crea in automatico anche un log che però sballa completamente e magari mi appaiono solo una decina di file.

    Per ora non metto il codice, che è un pò complicato, perchè volevo sapere se qualcuno ha avuto problemi del genere con questo comando.

    Se avete link utili sull'utilizzo ve ne sarei grato

    Grazie
    Mir
    Fotografario MultiUtente Interamente in Flash: QUI

  2. #2
    FileReferenceList altro non è che una collezione di FileReference ... con la FileReferenceList si procede così:

    1 - fai scegleire uno o più files
    2 - fai l'upload del primo
    3 - ad upload finito, se presente, fai partire l'upload del secondo
    4 - torni al punto 3 fino alla fine della lista di oggetti FileReference scelti dall'utente e restituiti dalla FileReferenceList

    Per avere uno stato di progressione dell'upload totale, devi prima fare un loop su tutte le size e salvare il totale sizes in una variabile, poi confronti durante l'upload del primo la sua size con il totale di tutte, finito l'upload aggiungi alla prima size quella in upload del secondo file, e via dicendo per avere una progressione sul totale.

    Per avere successo con ogni upload puoi interagire con il servfer attraverso chiamate in get in fase di upload, le SESSIONI, ad esempio, non vanno o sono buggate o sono diverse, quindi o cookie o get.

    Finito l'upload di un file il server oltre a spostare tale file dovrebbe verificare che tutto sia andato a buon fine, fermi temporaneamente l'upload totale, leggi con una LoadVars in semplice load l'info che ti interessa generata sul server ad upload terminato, fai partire in caso di successo l'upload successivo, sempre se presente.

    Le dimenzioni di ogni singolo file non devono superare il limite massimo presente sul server, altrimenti rischi di non ritrovarti file più grandi di 2 mega (per fare un esempio) ma magari uploadi tutti gli altri (19 contro 20).

    Per avere un riscontro sul server puoi anche servirti del valore error, riferito al file, che deve essere pari a 0.


    L'utilizzo della FileReferenceList potrebbe essere visto come una transazione, devi anche considerare, qualora l'insieme dei files scelti sia fondamentale o debba essere un numero certo di files (esempio inserimento in db di almeno 2 immagini di un prodotto), di dover tenere traccia di tutta l'operazione e di resettare quanto fatto fino a quel momento qualora un solo file non sia stato inserito / uploadato con successo.
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    714
    Ti ringrazio molto della risposta rapida ed esauriente ... ti chiedo però qualche chiarimento:

    Per avere successo con ogni upload puoi interagire con il servfer attraverso chiamate in get in fase di upload, le SESSIONI, ad esempio, non vanno o sono buggate o sono diverse, quindi o cookie o get.
    non capisco completamente il senso della frase quindi ti posto un esempio del mio codice:

    codice:
    listener.onSelect = function(fileRefList:FileReferenceList) {
        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))
    			if (item.type==".jpg" or item.type==".JPG" or item.type==".gif" or item.type==".jpeg" or item.type==".JPEG") {
    	item.upload(_root.link+_root.utente+"upload.php"+"?dir=/"+_root.nomecart)
    	_root.listload.push(item.name)
    	}	
    }
    qui faccio un solo controllo del type.
    Ed ecco il codice banalissimo lato server nul upload.php

    Codice PHP:
    <?php
    move_uploaded_file
    ($_FILES['Filedata']['tmp_name'], "./foto/".$_GET["dir"]."/".$_FILES['Filedata']['name']);
    ?>
    Ti sembra corretto il procedimento?
    Cosa intendi per le "chiamate in GET" al server?

    Grazie
    mir
    Fotografario MultiUtente Interamente in Flash: QUI

  4. #4
    Originariamente inviato da Mir
    Ti sembra corretto il procedimento?
    no.

    fai tanti uploads quanti sono i files scelti tutti in una botta dentro il for, mentre io ti consiglio di farne uno alla volta o rischi solo di intasare il server, inoltre non puoi avere con quel solo codice uno stato in percentuale dell'upload ed inoltre verificare il tipo di file quando puoi benissimo dare una lista di files validi direttamente in selezione non serve a niente.

    A questo aggiungo che il server con il solo move_upload senza alcun altro controllo non solo rischia di non mostrarti alcun eventuale problema / errore ma in quel modo rischia anche di mandarti giù il sito in mezzo secondo ... sai come ?

    banalmente inviando da una form anche in html un file index.php con una $_GET["dir"] uguale a "../", sovrascrivendo in men che non si dica la index.php (o altro file meno evidente) e dando la possibilità a chiunque di ravanare per il tuo host, leggendo magari la lista dei files .php e prendendo anche tutte le informazionidi connessione al db, password ed altro ancora.

    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    714
    A questo aggiungo che il server con il solo move_upload senza alcun altro controllo non solo rischia di non mostrarti alcun eventuale problema / errore ma in quel modo rischia anche di mandarti giù il sito in mezzo secondo ... sai come ?
    Si chiaro, tuttavia viene passata una variabile di controllo al php che non sono stato a riportare altrimenti chiaro che si poteva uplodare di tutto :P

    fai tanti uploads quanti sono i files scelti tutti in una botta dentro il for, mentre io ti consiglio di farne uno alla volta o rischi solo di intasare il server, inoltre non puoi avere con quel solo codice uno stato in percentuale dell'upload ed inoltre verificare il tipo di file quando puoi benissimo dare una lista di files validi direttamente in selezione non serve a niente.
    1. farne uno alla volta? io pensavo che la procedura eseguisse un upload alla volta, difatti con connessioni lente non è che flash uplodda file contemporaneamente. Io vedo lo stato di upload con
    codice:
    listener.onProgress = function(file:FileReference, bytesLoaded:Number, bytesTotal:Number)
    ma non lo utilizzo per gestire il caricamento ma solo per visionare lo stato di caricamento.

    2. selezionare una lista di file validi non è sufficiente, nella finestra di selezione dei file se metto *.* mi evidenzia tutti i file e quindi può inserire qualsiasi file ecco quindi il motivo di un successivo controllo!
    Fotografario MultiUtente Interamente in Flash: QUI

  6. #6
    Originariamente inviato da Mir
    Si chiaro, tuttavia viene passata una variabile di controllo al php che non sono stato a riportare altrimenti chiaro che si poteva uplodare di tutto :P
    se questa variabile di controllo è dentro l' SWF è la stessa cosa, si legge la variabile con undecompilatore e la si invia da altra pagina, il sunto è state attenti agli uploads, i controlli vanno fatti più sul server che sul client ... come ad esempio il tipo di immagine.

    Se invece hai omesso 3/4 del codice server ... beh, guarda che difficilmente avrai un sistema chissà quanto "fico" e se fai tuti i controlli come si deve non è che mostrandolo permetti agli altri di fare danni ... se ti serve un aiuto mostra il codice come è oppure si parla un pò a vanvera.



    Originariamente inviato da Mir
    1. farne uno alla volta? io pensavo che la procedura eseguisse un upload alla volta, difatti con connessioni lente non è che flash uplodda file contemporaneamente. Io vedo lo stato di upload con
    codice:
    listener.onProgress = function(file:FileReference, bytesLoaded:Number, bytesTotal:Number)
    ma non lo utilizzo per gestire il caricamento ma solo per visionare lo stato di caricamento.
    gli uploads partono tutti, poi se il sistema li accoda è un altro discorso ... fanne uno alla volta e stai tranquillo poichè sarai tu a gestire il sistema e non il contrario ...



    Originariamente inviato da Mir
    2. selezionare una lista di file validi non è sufficiente, nella finestra di selezione dei file se metto *.* mi evidenzia tutti i file e quindi può inserire qualsiasi file ecco quindi il motivo di un successivo controllo!
    ma scusa non è un upload fattibile solo se autenticati o solo in area di amministrazione ?
    o è un upload che può sfruttare chiunque ?

    In qualunque caso, cosa te ne fai di controlli di questo tipo quando:

    1 - non mostri niente se l'untete tenta di uploadare un file diverso da quello che ti aspetti
    2 - non fai alcun controllo nell'unico posto dove dovresti farlo, ovvero il server

    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  7. #7
    per fare un esempio di upload multiplo sotto controllo, senza averlo testato (ma mi sembra sia ok), guarda qua:
    codice:
    listener.onSelect = function(fileRefList:FileReferenceList) {
    	
    	function delayedUpload(Void):Void {
    		if(a < b) {
    			fileRefList.fileList[a].addListener(listener);
    			if(!fileRefList.fileList[a].upload("http://www.yourdomain.com/"))
    				trace("Errore con il file " + fileRefList.fileList[a].name);
    			++a;
    		} 
    		else {
    			// finito gli uploads ... fai quello che ti pare 
    		}
    	}
    	
    	var 	a:Number = 0, b:Number = fileRefList.fileList.length, actualSize:Number = 0, totalSize:Number = 0,
    			listener:Object = {
    				onProgress:function(file:FileReference, bytesLoaded:Number, bytesTotal:Number){
    					var percentuale:Number = ((bytesLoaded + actualSize) / totalSize) * 100;
    					trace(percentuale);
    				},
    				onComplete:function(file:FileReference):Void {
    					actualSize += file.size;
    					// in questo punto potresti mettere una 
    					// chiamata per verificare se l'upload precedente è andato a buon fine
    					// e solo in caso positivo richiamare anche la funzione
    					delayedUpload();
    				}
    			};
    	
    	while(a < b) {
    		totalSize += fileRefList.fileList[a].size;
    		// eventuali controlli sul tipo ... 
    	}
    	
    	// sempre che i controlli, se presenti, siano andati tutti a buon fine
    	if(totalSize > 0) {
    		a = 0;
    		delayedUpload();
    	}
    }
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    714
    Innanzitutto grazie per la disponibilità ed anche per le critiche. Testerò il tuo metodo che trovo estremamente interessante anche se non mi è del tutto chiaro ma finchè non lo provo non ti rompo.

    ciao
    mir

    PS:
    Alcuni chiarimenti:
    - è da tanto che le psw non le metto lato client ma le pesco dal server :P
    - l'upload è permesso solo a persone autorizzate ma questo non impedisce che qualcuno possa fare il furbo ed uploddi di tutto
    - il mio forte è flash ed in php me la cavicchio, ma ammetto che da quel che ho trovato online sia meglio fare i controlli lato server
    - non era mia intenzione omettere del codice ma, come detto all'inizio, cercavo qualcuno che avesse avuto problemi del genere o che potesse comunque darmi delle dritte come hai fatto tu, nel senso che la mia procedura è formalmente corretta tuttavia presenta un bug più legato al server che alla procedura stessa. Rimango comunque dell'idea che qualcosa non funzione nel listener.onComplete perchè il problema dovrebbe presentarsi, a maggior ragione, per connessioni lente quando il ciclo for spara fuori i file ... ma invece lo ho con connessioni veloci.
    Fotografario MultiUtente Interamente in Flash: QUI

  9. #9
    Originariamente inviato da Mir
    - è da tanto che le psw non le metto lato client ma le pesco dal server :P
    tu si, magari altri che leggono no ... do sempre risposte generiche e le poche volte che ho dato per scontato che "l'altro sapesse" ho sbagliato :P


    Originariamente inviato da Mir
    - l'upload è permesso solo a persone autorizzate ma questo non impedisce che qualcuno possa fare il furbo ed uploddi di tutto
    non è sul client che risolvi ... altro esempio, prendo un programma lo rinomino con estensione jpg elo shiaffo sul server ...


    Originariamente inviato da Mir
    la mia procedura è formalmente corretta
    è la copia identica della guida internal al Flash ... e non sempre gli esempi sono completi o ti dicono come trattare tutte le problematiche


    Originariamente inviato da Mir
    Rimango comunque dell'idea che qualcosa non funzione nel listener.onComplete
    se tu assegni un listener per ogni file che uploadi questo viene richiamato ogni volta da ognuno di questi ... non gestisce in automatico lo stato di tutti i files, può partire prima l'onComplete di uno piuttosto che di un altro e per evitare l'imprevedibilità devi usare un metodo come quello che ti ho scritto
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.