2013-03-18 2 views
0

Я создаю внутренний инструмент для своей команды, который позволит доверенным членам команды сохранять удаленные файлы на наш сервер через php и curl. У меня есть работа open, write и close, но я хотел бы добавить проверку, чтобы убедиться, что файл имеет определенный тип mime, прежде чем он создает и записывает локальный файл.cURL Сохранить файл на сервер с проверкой типа Mime

Как я могу сделать это на основе массива типов mime?

$ch = curl_init(); 
$fp = fopen($local_file, 'w+'); 
$ch = curl_init($remote_file); 
curl_setopt($ch, CURLOPT_TIMEOUT, 50); 
curl_setopt($ch, CURLOPT_FILE, $fp); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_ENCODING, ""); 
curl_exec($ch); 
curl_close($ch); 
fclose($fp); 
+0

Надеюсь, вы знаете, что тип mime, который отправляет сервер, настраивается на этом сервере. Например. любой, кто имеет php, может установить любой тип mime, который они хотят. Вы можете проверить расширение файла или использовать утилиту, например «файл», чтобы проверить содержимое. – JasonWoof

ответ

0

Например:

$ch = curl_init('http://static.php.net/www.php.net/images/php.gif'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_exec($ch); 

$mime = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); 

в $mime имеет тип пантомимы файла.

0

Tricky! Вы можете загрузить весь файл первым (в память или временную папку.) Если вы хотите, чтобы поток, вы, возможно, придется:

  1. набор CURLOPT_HEADER включать заголовки ответа HTTP в данных, вы получите обратно

  2. установить CURLOPT_WRITEFUNCTION вместо CURLOPT_FILE, прочитать и разобрать заголовки http, чтобы увидеть тип mime, а затем решить, собираетесь ли вы создавать/записывать файл или нет.

Очевидно, что это совсем немного работы, вы должны сделать некоторые основные синтаксического разбора заголовков HTTP, и, возможно, буферным получить целые заголовки HTTP сразу.

Надеюсь, кто-то опубликует более легкое решение.

псевдокод:

state = headers 
buf = '' 
fd = null 
func writefunc(ch, data) 
    if state is headers 
     buf .= data 
     div = buf.strpos "\r\n\r\n" 
     if div !== false 
     mime = get_mime buf, div 
     if mime_ok mime 
      fd = fopen ... 
      fd.write buf.substr div+4 
      state = saving 
     else 
      # returns other than data.length() abort connection 
      return 0 
    else 
    fd.write data 
    return data.length() 
+0

Что делать, если серверы не пропускают Content-Type? И что я хочу проверить размер файла перед тем, как загрузить его? – CMCDragonkai

+0

mime_ok вернет false, если нет типа mime. Протокол HTTP не всегда отправляет Content-Length. – JasonWoof

1

Я решил эту проблему путем проверки мим через FileInfo после того, как файл был передан. Если это не допустимый тип mime, я удаляю его.

$ch = curl_init(); 
$fp = fopen($local_file, 'w+'); 
$ch = curl_init($remote_file); 
curl_setopt($ch, CURLOPT_TIMEOUT, 50); 
curl_setopt($ch, CURLOPT_FILE, $fp); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_ENCODING, ""); 
curl_exec($ch); 
curl_close($ch); 
fclose($fp); 

$finfo = new finfo(FILEINFO_MIME); 
$mime_type = $finfo->file($local_file); 

if (strpos($mime_type, 'application/xml') === false) { 
    unlink($local_file); 
} 
Смежные вопросы