Для контекста то, что я пытаюсь сделать здесь, довольно просто:
Я пытаюсь создать на своей странице раздел мультиформного загрузчика, который принимает только файлы .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