Zakładając, że PHP 5.2.1 lub wyższe i może wykorzystywać owijkę strumień HTTPS copy()
i file_get_contents()
funkcja ta powinna być wszystkie potrzebne:
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);
}
Funkcja wykonuje szereg znaczników (np jako hFHUCB3iTxyMzseuWOgG
) jako argument.
można nazwać jak
getFilepickerFiles(array('hFHUCB3iTxyMzseuWOgG'));
Nie wiem dokładnie co Filepicker przechodzi do serwera, ale jeśli jest to pełny adres URL pliku jak
https://www.filepicker.io/api/file/hFHUCB3iTxyMzseuWOgG
następnie można wyodrębnić tokeny jak to:
$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()
można również umieścić, że prawo do getFilepickerFiles()
aby wziąć tablicę adresów URL plików zamiast:
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);
}
Wyjaśnienie
czuję się jak w powyższym kodzie jest raczej proste, ale oto jak getFilepickerFiles()
prace (powinieneś przeczytać Rest API documentation przed przeczytaniem tego):
$files = array('name' => array(),
'type' => array(),
'tmp_name' => array(),
'error' => array(),
'size' => array());
Initialize $files
do tablicy takiej jak $_FILES
bez plików.
$tmpdir = sys_get_temp_dir();
Pobierz katalog, w którym przechowywane są pliki tymczasowe, ponieważ mamy zamiar pobrać pliki tam (Ta funkcja wymaga PHP 5.2.1 lub wyższej).
foreach($urls as $url)
To, co powinno być foreach
powinno być jasne.
$files['tmp_name'][] = $tmp = $tmpdir.'/php'.$token;
budować naszą tymczasową ścieżkę, na wzór $_FILES
(czyli ścieżkę do folderu plików tymczasowych, ciąg „php”, a niektóre losowych znaków).
Nazwę tę przypisujemy do $tmp
(dla łatwego późniejszego użycia) i dodajemy ją do listy ścieżek plików.
$files['error'][] = (int)(!copy('https://www.filepicker.io/api/file/'.$token, $tmp));
Spróbuj pobrać plik do $tmp
za pomocą copy()
z adresem URL jako źródła.
Wartość zwrócona przez copy()
to TRUE
w przypadku sukcesu i FALSE
w przypadku niepowodzenia.
Wartości błędów występujące w $_FILES
to UPLOAD_ERR_OK
w przypadku sukcesu i inne wartości w inny sposób (source, w przypadku niepowodzenia wystąpię z UPLOAD_ERR_NO_FILE
).
Aby przypisać sensowną wartość błędu, używamy operatora trójargumentowego, aby dodać UPLOAD_ERR_OK
do listy kodów błędów, jeśli copy()
zwraca w innym przypadku TRUE
i UPLOAD_ERR_NO_FILE
.
$files['size'][] = filesize($tmp);
Sprawdź rozmiar pliku i dodaj go do listy rozmiarów plików.
$meta = json_decode(file_get_contents('https://www.filepicker.io/api/file/'.$token.'/metadata?filename=true&mimetype=true'), TRUE);
Get metadanych pliku przy użyciu adresu URL jako argument file_get_contents()
, która powinna zwracać tablicę JSON że dekodowania do tablicy asocjacyjnej z wykorzystaniem json_decode(/*...*/, TRUE)
.
Ponieważ dodaliśmy &filename=true&mimetype=true
na końcu adresu URL, otrzymamy tylko wartości filename
i mimetype
- nie potrzebujemy całej reszty.
Dekodowana tablica przypisana do $meta
;
$files['name'][] = $meta['filename'];
$files['type'][] = $meta['mimetype'];
Dodaj wartości filename
i mimetype
z tylko dekodowane tablicy JSON do wykazów nazw plików i typów MIME odpowiednio.
return array('image' => $files);
zwraca tablicę z kluczem wskazując na tablicy plików stworzyliśmy image
.
Skończyliśmy.
Demo? :(
Nie zamierzam budować dla tego całego serwisu hostingowego plików, ponieważ zajęłoby to pięciokrotność czasu potrzebnego na napisanie tej odpowiedzi:
Obawiam się, że nie mogę ci zapewnić z w pełni działającą demonstracją na żywo.
Niestety, ani 3v4l, ani codepad nie mają włączonego strumienia streamów HTTPS, więc nie jestem w stanie przedstawić "demonstracyjnej wersji demonstracyjnej" koncepcji "zobacz dla siebie".
Najlepsze, co mogę zrobić, to prawdopodobnie zrzut ekranu z mojego okna terminala (kliknij aby powiększyć):
Jeśli można podać filepicker kod integracji, która pomoże, gdyż istnieje inna metoda robi to jak [za pomocą widżetu] (https://www.filepicker.com/documentation/file_ingestion/widgets/pick), [Javascript pick multiple] (https://www.filepicker.com/documentation/file_ingestion/javascript_api/pick_multiple) , [wybór i przechowywanie kodu javascript] (https://www.filepicker.com/documentation/file_ingestion/javascript_api/pick_and_store), itp. i odpowiedź może być różna dla różnych sposobów integracji –