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):
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 –