PHP: простая файловая шара (upload, download, delete, open)

DOWNLOAD/OPEN

При генерации файла обязательно делаем скобки вокруг “file_name”, иначе в случае если в имени файла есть пробел firefox будет показывать только первое слово, хотя другие браузеры этим страдать не будут. Mozilla давно сказала, что исправлять это не будет т.к. такое поведение соответствует RFC.

header("Content-Disposition: attachment; filename=\"$file_name\"");

Для открытия сразу в корректном приложении нужно понимать, какое приложение открывать. По mime типу приложения определяем content-type с помощью функции mime_content_type, которая определяет тип mime на основе файла magic.mime. В результате не нужно делать свои сопоставления типо .pdf -> application/pdf.

$mime_content_type = mime_content_type("$path");
header("Content-type: $mime_content_type");

 

VIEW

Для просмотра директории (отображения на стартовой странице всех файлов) используется scandir.

Чтобы кнопки submit не были со служебными “file_dld” используется элемент button.

 

UPLOAD

Полноценный скрипт upload с описанием тут.

Что добавить:

  • если файлы большие правим в php.ini и убираем проверку размера в самом скрипте (Check file size)
post_max_size = 300M 
upload_max_filesize = 300M
  • если тип файлов один должен быть разрешен для загрузки, то логично в input type=file добавить тип файла через accept, чтобы при выборе файла в фильтре был предварительно выбран тип
 echo "<input type=\"file\" name=\"fileToUpload\" id=\"fileToUpload\" accept=\".zip\">";

Весь код (для вставки использовался плагин syntaxhighlighter):

[code language=”php”]
// DOWNLOAD
if(!empty($_POST[‘file_dld’]))
{
$file=$_POST[‘file_dld’];
$file_name=’$file’;
$file=’uploads/$file’;
// обязательно чистим буфер или файлы будут ломаться
if (ob_get_level()) {
ob_end_clean();
}
header(‘Content-Description: File Transfer’);
header(‘Content-Type: application/octet-stream’);
header(‘Content-Disposition: attachment; filename=\’$file_name\”); // with mozila exist trouble with name with backspace! (not with ms-edge, chrome)
header(‘Expires: 0’);
header(‘Cache-Control: must-revalidate’);
header(‘Pragma: public’);
header(‘Content-Length: ‘ . filesize($file));
readfile($file);
exit();
}

// OPEN
if(!empty($_POST[‘file_opn’]))
{
$file=$_POST[‘file_opn’];
$file_name=’$file’;
$path=’uploads/$file’;
if(is_file($path))
{
// обязательно чистим буфер или файлы будут ломаться
if (ob_get_level()) {
ob_end_clean();
}
// тип mime определяем на основе файла magic.mime
$mime_content_type = mime_content_type(‘$path’);
header(‘Content-type: $mime_content_type’);
header(‘Content-Disposition: inline; filename=\’$file_name\”);
readfile($path);
exit();
}
else
{
$msg_send_after_menu=’Файла \’$file\’ не существует.’;
}
}

// DELETE
if(!empty($_POST[‘file_dlt’]))
{
$file=$_POST[‘file_dlt’];
$path=’uploads/$file’;
if(is_file($path))
{
touch(‘$path’);
rename(‘$path’, ‘deleted/$file’);
$msg_send_after_menu=’Файл \’$file\’ перемещен в папку deleted.’;
}
else
{
$msg_send_after_menu=’Файла \’$file\’ не существует.’;
}
}

// UPLOAD
if (isset($_FILES[‘fileToUpload’]))
{
$target_dir = ‘uploads/’;
$file_size = $_FILES[‘fileToUpload’][‘size’];
$file_name = $_FILES[‘fileToUpload’][‘name’];
$target_file = $target_dir . $file_name;
if (move_uploaded_file($_FILES[‘fileToUpload’][‘tmp_name’], $target_file)) {
$msg_send_after_menu=’Файл \’$file_name\’ загружен.’;
} else {
$msg_send_after_menu=’Ошибка: ошибка при загрузке file_name:$file_name;file_size:$file_size,filetype:$filetype’;
}
}

// PRINT FORM IF NO FILE
echo ‘
&lt;hr size=1&gt;

‘;
if($msg_send_after_menu != ”)
{
print_str(‘$msg_send_after_menu&lt;/br&gt;’);
}
print_str(‘&lt;b&gt;Загруженные файлы:&lt;/b&gt;’);

// GET ALL FILES from DIR
$path = ‘uploads’;
$files = scandir($path);
$files = array_diff(scandir($path), array(‘.’, ‘..’));;

// DOWNLOAD FORM
echo ‘
&lt;form method=\’post\’&gt;
‘;
echo ‘
&lt;table&gt;’;
foreach($files as $file)
{
echo ‘
&lt;tr&gt;’;
echo ‘
&lt;td&gt;$file&lt;/td&gt;

‘;
echo ‘
&lt;td&gt;&lt;button type=submit name=file_dld class=\’buttonstyle\’ value=\’$file\’&gt;Скачать&lt;/button&gt;&lt;/td&gt;

‘;
echo ‘
&lt;td&gt;&lt;button type=submit name=file_opn class=\’buttonstyle\’ value=\’$file\’&gt;Открыть&lt;/button&gt;&lt;/td&gt;

‘;
echo ‘
&lt;td&gt;&lt;button type=submit name=file_dlt class=\’buttonstyle\’ value=\’$file\’ onclick=\’return confirm(‘Вы уверены?’)\’&gt;Удалить&lt;/button&gt;&lt;/td&gt;

‘;
echo ‘&lt;/tr&gt;

‘;
}
echo ‘&lt;/table&gt;

‘;
echo ‘&lt;/form&gt;

‘;

// UPLOAD FORM
echo ‘
&lt;hr size=1&gt;

‘;
echo ‘
&lt;form method=\’post\’ enctype=\’multipart/form-data\’&gt;’;
echo ‘&lt;input type=\’file\’ name=\’fileToUpload\’ id=\’fileToUpload\’ accept=\’\’&gt;’;
echo ‘&lt;input type=\’submit\’ class=\’buttonstyle\’ value=\’Загрузить\’ name=\’submit\’&gt;’;
echo ‘&lt;/form&gt;

‘;

[/code]

Leave a Reply