2016-11-16 5 views
0

У меня возникла проблема с утверждением php для загрузки моего файла. Я хочу, чтобы пользователь загружал только файлы .xml. Но это не сработает.ограничение загрузки файлов php для файлов xml с помощью mime

Вот мой HTML форма:

<form action="upload2.php" method="post" enctype="multipart/form-data"> 
    Wähle deine Sprachdatei aus: 
    <input type="file" class="form-control-file" name="upfile"> 
    <br> 
    <input type="submit" class="btn btn-primary" value="Sprachdatei hochladen" name="submit"> 
</form> 

и вот мой PHP контролировать файл через MIME-тип:

<?php 
header('Content-Type: text/plain; charset=utf-8'); 
try { 

// Undefined | Multiple Files | $_FILES Corruption Attack 
// If this request falls under any of them, treat it invalid. 
if (
    !isset($_FILES['upfile']['error']) || 
    is_array($_FILES['upfile']['error']) 
) { 
    throw new RuntimeException('Invalid parameters.'); 
} 

// Check $_FILES['upfile']['error'] value. 
switch ($_FILES['upfile']['error']) { 
    case UPLOAD_ERR_OK: 
     break; 
    case UPLOAD_ERR_NO_FILE: 
     throw new RuntimeException('No file sent.'); 
    case UPLOAD_ERR_INI_SIZE: 
    case UPLOAD_ERR_FORM_SIZE: 
     throw new RuntimeException('Exceeded filesize limit.'); 
    default: 
     throw new RuntimeException('Unknown errors.'); 
} 

// You should also check filesize here. 
if ($_FILES['upfile']['size'] > 1000000) { 
    throw new RuntimeException('Exceeded filesize limit.'); 
} 

// DO NOT TRUST $_FILES['upfile']['mime'] VALUE !! 
// Check MIME Type by yourself. 
$finfo = new finfo(FILEINFO_MIME_TYPE); 
if (false === $ext = array_search(
     $finfo->file($_FILES['upfile']['tmp_name']), 
     array(
      'xml' => 'text/xml', 
      'txt' => 'text/plain', 

     ), 
     true 
    )) { 
    throw new RuntimeException('Invalid file format.'); 
} 

// You should name it uniquely. 
// DO NOT USE $_FILES['upfile']['name'] WITHOUT ANY VALIDATION !! 
// On this example, obtain safe unique name from its binary data. 
if (!move_uploaded_file(
    $_FILES['upfile']['tmp_name'], 
    sprintf('./uploads/%s.%s', 
     sha1_file($_FILES['upfile']['tmp_name']), 
     $ext 
    ) 
)) { 
    throw new RuntimeException('Failed to move uploaded file.'); 
} 

echo 'File is uploaded successfully.'; 
} catch (RuntimeException $e) { 
echo $e->getMessage(); 
} 
?> 

с простым JPG и детским он работает, но не с XML. Я проверил тип MIME, и это до сих пор не работает

Я использую XAMPP на Windows, чтобы запустить PHP

Спасибо за вашу помощь.

+0

Вы проверили, какой файл $ finfo-> ($ _ FILES ['upfile'] ['tmp_name']) 'действительно возвращается? –

+0

Извините. Я php lerner. Как это проверить? – Joscha

ответ

0

Похоже, $finfo->file() возвращает application/xml вместо text/xml для xml-файлов.

Измените массив действительных мим-типов к этому:

array(
    'xml' => 'application/xml', 
    'txt' => 'text/plain', 
), 
+0

спасибо, что сработало :) – Joscha

-1

Попробуйте на код ниже. Расширение файла стало корректным для вашего кода.

если (! Move_uploaded_file ( $ _FILES [ 'upfile'] [ 'tmp_name'], 'загрузки /. Базовое имя ($ _ FILES [ "upfile"] [ "имя"] ) ))

+0

Как это связано с его вопросом? –

+0

Когда я проверил локальную машину, файл загружался без расширения. –

+0

Это нормально. Но это был не его вопрос. Он хотел ограничить загрузку MIME-типа. Во всяком случае, он получил ответ, который сработал для него. –