2013-12-09 8 views
2

По некоторым техническим вопросам я не могу отправить файл с моего ввода на мой сервер традиционным способом. Я должен прочитать данные из файла, привязать это к модели и отправить эти данные (как огромную строку) на сервер. Допустим, что мой пользователь загрузить .jpg, мой код выглядит следующим образом:Есть ли способ узнать тип файла только с данными

// This return the data in the form of a simple string. 
$data = $this->getRequest()->request->get('document[document_file]', null, true); 

// Let's assume that I know what type of file my user send me 
$data = explode("data:image/jpeg;base64,", $file); 
$data = base64_decode($data[1]); 
$image = imagecreatefromstring($data); 

imagejpeg($image, "test.jpg"); 

Моя проблема заключается в том, что я понятия не имею, какой тип файла мой пользователь будет загружать. Есть ли способ узнать, какой тип файла он имеет, и сохранить его более эффективным способом. Каков более эффективный способ решения такой проблемы?

EDIT: Следует отметить, что это не всегда изображение. Это может быть .pdf, .doc, .txt!

+0

Попробуйте посмотреть на FILEINFO расширения: http://php.net/manual/pl/book.fileinfo.php, или если вы ожидаете изображения, вы можете попробовать проверить файл, используя 'imagecreatefromstring() ',' getimagesizefromstring() 'и т. д. и проверьте наличие ошибок. – piotrekkr

+0

@piotrekkr Я не знаю, если это образ, это может быть .doc, .txt, .pdf, я посмотрю на fileinfo –

+1

Я написал 'если вы ожидаете изображения', а не если вы уверены:) – piotrekkr

ответ

2

Поскольку у вас есть содержимое изображения в строке, вы можете использовать getimagesizefromstring(), который содержит поле mime, которое сообщит вам тип изображения.

$data = base64_decode($data[1]); 
$info = getimagesizefromstring($data); 
$mime = $info['mime']; 

Если вам нужна поддержка для любой файл, а не только изображения, вам нужно либо написать собственный файл парсер или, если у вас есть расширение FileInfo PECL, вы можете использовать finfo_file():

$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$mime = finfo_file($finfo, '/path/to/your/file.jpg'); 
finfo_close($finfo); 

Предостережение о том, что вам нужен фактический файл, а не строка (но вы всегда можете записать строку во временный файл).

EDIT: Вот ответ, чтобы решить вопрос без необходимости создания файла. Давайте возьмем следующие данные изображения:

data:image/jpeg;base64/9j/4AAQSkZJRgA [...] xD5epeRHJ4glkjk/sb7R5lrFJ5fmfu/wDv5W1TEV/5wp+58 

Вы должны сначала разобрать его первый

$data = explode(",", $data); 

Затем вставьте строку в буфер

$finfo->buffer(base64_decode($data[1])) 

Наконец, используйте the answer from @JohnErck для разрешите тип расширения.

file_put_contents($path . $filename . AppUtil::FileExt($data[1]), $data[1]); 
+0

Итак, я бы сохранил файл без расширения, а затем прочитал его из finfo и вычитал бы расширение из этого? –

+0

@MichaelVilleneuve Да; типы файлов зависят не только от расширения файла (например, вы можете сохранить jpeg как «img.png», и он все равно откроет/отредактирует штраф). * Почти * все файлы имеют заголовки в них, которые объявляют, каков их фактический тип файла. – newfurniturey

+0

Я нахожусь на нем, вернусь к вам с результатом, спасибо за ваше время (не знаю, почему кто-то вас превзошел!) –

0

«файл» Unix инструмент подскажет вам, что файл на основе «магического числа» в начале - может быть, вы могли бы раскошелиться/оболочка/назовете?

Пример:

file sem.pl sean.zip Windows.pdf 
sem.pl: a /usr/bin/perl script text executable 
sean.zip: Zip archive data, at least v1.0 to extract 
Windows.pdf: PDF document, version 1.5 
Смежные вопросы