2015-04-30 10 views
10

Ho semplice controllo/i file HTML sul mio modulo. È di natura dinamica, significa che l'utente può caricare uno o più file. Il suo HTML è il seguente:Come convertire la richiesta di caricamento di file/s fatta tramite Filepicker nella richiesta simile fatta usando semplici controlli/file HTML in PHP?

<input type="file" id="image_book" class="image_book upload" name="image[]" accept="image/*" value=""/> 

Se posso caricare due immagini utilizzando sopra il controllo file HTML e inviare il modulo vengo seguito a $_FILES array (uscita di print_r($_FILES);):

Array 
(
    [image] => Array 
     (
      [name] => Array 
       (
        [0] => Aurbd-b3582991-large.jpg 
        [1] => BL_Miller_GD_Square_KV_300dpi_A2.jpg 
       ) 

      [type] => Array 
       (
        [0] => image/jpeg 
        [1] => image/jpeg 
       ) 

      [tmp_name] => Array 
       (
        [0] => /tmp/phpSt8CJJ 
        [1] => /tmp/phpibFjR2 
       ) 

      [error] => Array 
       (
        [0] => 0 
        [1] => 0 
       ) 

      [size] => Array 
       (
        [0] => 519179 
        [1] => 86901 
       ) 

     ) 

) 

Ora, secondo il nuovo requisito Devo usare Filepicker invece dei semplici controlli/file HTML per caricare file sul server. Ma il problema che sto affrontando è che l'ulteriore logica e manipolazione del codice è già stata scritta considerando il contenuto dell'array sopra ($_FILES).

Quindi, voglio convertire la richiesta proveniente da Filepicker nello stesso formato dell'array $_FILES in modo che non ci sia bisogno di apportare modifiche alla logica e alle manipolazioni del codice già scritte.

Lascia che ti spieghi lo scenario in modo più chiaro, se l'utente seleziona uno o più file di immagine da Google Drive tramite Filepicker e invia il modulo, la richiesta conterrà gli URL di quelle immagini generate da Filepicker e i nomi dei file.

Desidero utilizzare questi dati e formare l'array come sopra dell'array ($_FILES).

+0

se è possibile fornire il codice di integrazione filepicker che vi aiuterà, in quanto vi sono metodo diverso per fare questo mi piace [usando widget] (https://www.filepicker.com/documentation/file_ingestion/widgets/pick), [Javascript Pick Multiple] (https://www.filepicker.com/documentation/file_ingestion/javascript_api/pick_multiple) , [javascript pick and store] (https://www.filepicker.com/documentation/file_ingestion/javascript_api/pick_and_store), ecc. e la risposta può variare per questo diverso modo di integrazioni –

risposta

6

Supponendo che si sta utilizzando PHP 5.2.1 o superiore e può utilizzare il wrapper flusso HTTPS in copy() e file_get_contents(), questa funzione dovrebbe essere tutto ciò che serve:

function getFilepickerFiles($tokens) 
{ 
    $files = array('name' => array(), 
        'type' => array(), 
        'tmp_name' => array(), 
        'error' => array(), 
        'size' => array()); 
    $tmpdir = sys_get_temp_dir(); 
    foreach($tokens as $token) 
    { 
     $files['tmp_name'][] = $tmp = $tmpdir.'/php'.$token; 
     $files['error'][] = copy('https://www.filepicker.io/api/file/'.$token, $tmp) ? UPLOAD_ERR_OK : UPLOAD_ERR_NO_FILE; 
     $files['size'][] = filesize($tmp); 
     $meta = json_decode(file_get_contents('https://www.filepicker.io/api/file/'.$token.'/metadata?filename=true&mimetype=true'), TRUE); 
     $files['name'][] = $meta['filename']; 
     $files['type'][] = $meta['mimetype']; 
    } 
    return array('image' => $files); 
} 

Questa funzione richiede una serie di gettoni (come ad come hFHUCB3iTxyMzseuWOgG) come argomento.
Si può chiamare come

getFilepickerFiles(array('hFHUCB3iTxyMzseuWOgG')); 

Non so esattamente cosa filepicker passa al server, ma se si tratta di un URL completo del file come

https://www.filepicker.io/api/file/hFHUCB3iTxyMzseuWOgG 

quindi è possibile estrarre i token come questo:

$tokens = array(); 
foreach($urls as $url) 
{ 
    $matches = array(); 
    preg_match('# ^https://www\\.filepicker\\.io/api/file/([^/]*)/?', $url, $matches); 
    $tokens[] = $matches[1]; 
} 
// Pass $tokens to getFilepickerFiles() 

si potrebbe anche mettere che a destra in getFilepickerFiles() per renderlo prendere una serie di URL di file, invece:

function getFilepickerFiles($urls) 
{ 
    $files = array('name' => array(), 
        'type' => array(), 
        'tmp_name' => array(), 
        'error' => array(), 
        'size' => array()); 
    $tmpdir = sys_get_temp_dir(); 
    foreach($urls as $url) 
    { 
     $matches = array(); 
     preg_match('# ^https://www\\.filepicker\\.io/api/file/([^/]*)/?', $url, $matches); 
     $token = $matches[1]; 
     $files['tmp_name'][] = $tmp = $tmpdir.'/php'.$token; 
     $files['error'][] = copy('https://www.filepicker.io/api/file/'.$token, $tmp) ? UPLOAD_ERR_OK : UPLOAD_ERR_NO_FILE; 
     $files['size'][] = filesize($tmp); 
     $meta = json_decode(file_get_contents('https://www.filepicker.io/api/file/'.$token.'/metadata?filename=true&mimetype=true'), TRUE); 
     $files['name'][] = $meta['filename']; 
     $files['type'][] = $meta['mimetype']; 
    } 
    return array('image' => $files); 
} 

Spiegazione

mi sento come il codice di cui sopra è piuttosto semplice, ma ecco come getFilepickerFiles() opere (si dovrebbe hanno letto la Rest API documentation prima di leggere questo):

$files = array('name' => array(), 
       'type' => array(), 
       'tmp_name' => array(), 
       'error' => array(), 
       'size' => array()); 

inizializzazione $files in un array come $_FILES senza file.

$tmpdir = sys_get_temp_dir(); 

Prendi la directory in cui sono memorizzati i file temporanei, perché stiamo andando scaricare i file non (questa funzione richiede PHP 5.2.1 o superiore).

foreach($urls as $url) 

Quello che foreach deve essere chiaro.

$files['tmp_name'][] = $tmp = $tmpdir.'/php'.$token; 

costruire il nostro percorso di file temporanei, seguendo il modello di $_FILES (vale a dire il percorso della cartella dei file temporanei, la stringa "php", e alcuni caratteri casuali).
Questo nome viene assegnato a $tmp (per un utilizzo più facile in seguito) e lo aggiungiamo all'elenco dei percorsi dei file.

$files['error'][] = (int)(!copy('https://www.filepicker.io/api/file/'.$token, $tmp)); 

tentare di scaricare il file da $tmp utilizzando copy() con un URL come sorgente.
Il valore restituito da copy() è TRUE in caso di successo e FALSE in caso di errore.
I valori di errore presenti in $_FILES sono UPLOAD_ERR_OK in caso di esito positivo e qualsiasi altro valore in caso contrario (source, vado con UPLOAD_ERR_NO_FILE qui in caso di errore).
Quindi, per assegnare un valore di errore significativo, si utilizza l'operatore ternario per aggiungere UPLOAD_ERR_OK all'elenco dei codici di errore se copy() restituisce TRUE e UPLOAD_ERR_NO_FILE in caso contrario.

$files['size'][] = filesize($tmp); 

Interrogare le dimensioni del file e aggiungerlo all'elenco delle dimensioni dei file.

$meta = json_decode(file_get_contents('https://www.filepicker.io/api/file/'.$token.'/metadata?filename=true&mimetype=true'), TRUE); 

Get file di metadati utilizzando un URL come argomento di file_get_contents(), che dovrebbe restituire una matrice JSON che decodificarli in un array associativo utilizzando json_decode(/*...*/, TRUE).
Poiché abbiamo aggiunto &filename=true&mimetype=true alla fine dell'URL, otterremo solo i valori filename e mimetype - non abbiamo bisogno di tutto il resto.
L'array decodificato assegnato a $meta;

$files['name'][] = $meta['filename']; 
$files['type'][] = $meta['mimetype']; 

aggiungere i valori filename e mimetype dalla matrice JSON appena decodificato agli elenchi di nomi di file ei tipi MIME, rispettivamente.

return array('image' => $files); 

restituire un array con la punta image chiave per la serie di file che abbiamo creato.

E abbiamo finito.


Demo? :(

Non ho intenzione di creare un intero sito di hosting di file per questo, perché ci vorrebbero cinque volte il tempo necessario per scrivere questa risposta
Quindi temo di non poterti fornire con una demo live completamente funzionante.

Sfortunatamente, né lo 3v4l né lo codepad hanno il wrapper dello stream HTTPS abilitato, quindi non sono nemmeno in grado di fornire una dimostrazione di dimostrazione del concetto "da vedere".

Il meglio che posso fare è probabilmente uno screenshot del mio finestra di terminale (clicca per ingrandire):

enter image description here

+0

Prima di tutto anks per il tuo aiuto. Apprezzo molto gli sforzi profusi per risolvere il mio problema e aiutarmi a risolvere questo problema. Ma voglio lo stesso risultato di $ _FILES. Nel tuo tentativo la struttura dell'array è abbastanza diversa. Il tasto ['image'] è mancante all'inizio dell'array. Puoi fare le modifiche necessarie al tuo codice per aggiungere la chiave ['immagine'] e rendere la matrice risultante simile a $ _FILES. Grazie ancora. – PHPLover

+0

Hai ragione, mi sono perso. Aggiornato la mia risposta. – Siguza

+0

Ho provato il tuo codice. Sono stato anche in grado di convertire la matrice nel formato desiderato. Ma ancora una volta ha sollevato un nuovo problema. Il file non viene caricato sul server dopo l'elaborazione dell'array di $ files (quello ottenuto dalla richiesta di filepicker). Hai affrontato lo stesso problema? – PHPLover

Problemi correlati