PHP 7.x - правильный mime-тип для .tgz, вызывая bash-скрипт с переменными в качестве параметров из PHP - PullRequest
0 голосов
/ 11 марта 2019

Для контекста то, что я пытаюсь сделать здесь, довольно просто:

Я пытаюсь создать на своей странице раздел мультиформного загрузчика, который принимает только файлы .tgz объемом менее 3 ГБ и принимает до 20 файлов одновременно.

У меня есть тот же блок кода, который работает для zip-файлов на другой странице, которую я использую, что, кажется, хорошо работает с mime-типом "application \ zip"

Моя главная цель - принять файлы, переместить их в каталог после приема и запустить скрипт bash или python, передавая параметры из части кода php для обработки входящих файлов.

Ниже мой upload.php.

<code><html>
    <header>
<link rel="stylesheet" id="enrollment-style-css" href="http://10.234.8.216/wp-content/themes/enrollment/style.css?ver=1.0.3" type="text/css" media="all">
    </header>
    <body>
        <div id="primary" class="content-area">
        <div class = "cv-container">
        <div class="iframe_submit" style="position:relative; float:left; ">
<?php

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('Upload a performance zip file then click submit and wait until a serial number appears. This could take a few minutes.');
    }

    // 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.');
    }

define('KB', 1024);
define('MB', 1048576);
define('GB', 1073741824);
define('TB', 1099511627776);
    // You should also check filesize here.
    if ($_FILES['upfile']['size'] > 3072*MB) {
        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(
            'tgz' => 'application/x-compressed',
            'tgz' => 'application/gnutar', 
        ),
        true
    )) {
        throw new RuntimeException('Invalid file format, please Upload a Performance ZIP file.');
    }

    // 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('./tmp/%s.%s',
            sha1_file($_FILES['upfile']['tmp_name']),
            $ext
        )
    ))
    {
        throw new RuntimeException('Failed to move uploaded file.');
    }

    echo 'File was uploaded and processed. Please use feedback button to report issues.';
    $output1 = shell_exec("./somescript.sh"'"$_FILES");
    echo "<pre>$output1
"; } catch (RuntimeException $ e) { echo $ e-> getMessage (); } ?>
  • Отправленный файл: <? Php echo $ _FILES ['upfile'] ['name']; ?>
  • Размер файла: <? Php echo $ _FILES ['upfile'] ['size']; ?>
  • Тип файла: <? Php echo $ _FILES ['upfile'] ['type']?>

Я обнаружил некоторые проблемы здесь в этом коде, но я изо всех сил пытался сделать что-то кроме минимума в PHP.

Например:

<code>echo 'File was uploaded and processed. Please use feedback button to report issues.';
$output1 = shell_exec("./somescript.sh"'"$_FILES");
echo "<pre>$output1
";

Я понимаю, что часть $ _FILES неверна, но я не уверен, как переносить переменные в PHP.

Нижняя часть:

if (false === $ext = array_search(
    $finfo->file($_FILES['upfile']['tmp_name']),
    array(
        'tgz' => 'application/x-compressed',
        'tgz' => 'application/gnutar', 
    ),

На самом деле не дает никакого результата, так как я полагаю, что mimetype может быть неправильным, потому что я не получаю подтверждения со страницы, где я загружаю .tgz или какой-либо файл вообще при использовании этих определений.

Я также заметил, что индикатор размера файла здесь не работает:

if ($_FILES['upfile']['size'] > 3072*MB) {
    throw new RuntimeException('Exceeded filesize limit.');
}

Если я переключаю mimetype на «application \ zip», я получаю сообщения, указывающие, что размер превышен, когда он явно не превышает того, что я намерен определить здесь.

Я знаю, что распаковывать очень много, но мне трудно найти примеры, которые работают в рамках того, что я делаю.

OS = Centos 7

php -v

PHP 7.2.16 (cli) (построено: 5 марта 2019 14:45:10) (NTS) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...