sequelone / upload-laravel
为Laravel上传大文件
Requires
- php: >=5.5.9
Requires (Dev)
- phpunit/phpunit: ^7.5
Suggests
- predis/predis: Needed to support instant completion
README
现在使用Laravel扩展包上传大文件变得非常简单。
特性
- 进度百分比指示器
- 文件类型限制 [x]
- 文件大小限制 [x]
- 多语言
- 分组配置 [x]
- 自定义中间件
- 自定义路由
0 在终端切换到您的laravel项目根目录,并执行composer require sequelone/upload-laravel ~2.0
1 (对于Laravel 5.5+跳过)在config/app.php
的providers
数组中添加一行Upload\UploadServiceProvider::class,
2 执行php artisan upload:publish
以发布一些文件和目录。
3 在浏览器中访问https://site.com/upload
。您可以访问示例页面。
提示:要更改相应的配置参数,请编辑文件config/upload.php
主要用途
文件上传:请参考示例文件的注释部分,并在需要上传大文件页面上输入相应的文件和代码。可以使用自定义中间件对上传文件进行额外过滤,并通过上传完成事件进一步处理上传的文件。
分组配置
自动创建相应的目录php artisan upload:groups
自定义中间件:请参考Laravel中间件文档,创建自己的中间件,并在“内核”部分注册,例如在配置文件中注册了中间件,例如 ' ['middleware1', 'middleware2']"。
上传完成事件:分为上传前和上传后事件,请参考Laravel框架文档中的系统事件目录,在'EventServiceProvider'中注册事件和监听器,执行'php artisan event:generate'创建事件和监听器,如果已注册,请填写配置文件中相应的完整类名,例如 'app\Events\OrderShipped'。
** 添加了二次扫描功能(需要Redis和浏览器支持)**
安装Redis并启动服务器。安装包 predis 'composer require predis/predis'。确保在下载页面上包含 spark-md5.min.js。
- 提示:Redis支持二次扫描列表,实际文件资源的变化(添加和删除)应与二次扫描列表同步,否则将产生脏数据。包扩展包含了一个新部分,当删除文件资源时,用户需要手动调用相应的方法来删除文件资源。* 在PHP中 \Upload\Util::deleteResource ($savedPath); // 删除相应的文件资源 \Upload\Util::deleteRedisSavedPath ($savedPath); // 删除相应的Redis二次扫描记录
** Распределенное развертывание (требуется междоменная поддержка Redis и домена)**
Распределенное развертывание разделив сервер приложений и сервер хранения, можно уменьшить нагрузку на сервер приложений, увеличить количество одновременных подключений к приложению, уменьшить сцепление, снизить риск единой точки отказа, повысить эффективность доступа, после включения распределенного развертывания сервер приложений не будет обрабатывать никаких запросов на загрузку и доступ.
Установите Redis и запустите сервер.Установите пакет predis 'composer require predis/predis'.Убедитесь, что форма страницы загрузки содержит ' {{storage_host_field ()}}`.
Конфигурация сервера приложений:
В`config/upload.php настройте параметр'distributed_deployment 'в ' enable' на 'true', 'role' на 'web', 'storage_host' на доменное имя сервера хранения`http://storage.your-domain.com".
В файле`. env` измените элементы конфигурации 'APP_NAME' и 'APP_KEY' на соответствующие конкретные значения, соответствующие конфигурации сервера хранения. SESSION_DOMAIN=.your-domain.com измените конфигурацию SESSION_DRIVER=redis', чтобы поделиться сеансом.
Конфигурация сервера хранения:
В config/upload.php`настройка'distributed_deployment товаров в'enable с'установить правду", "роль с'набор для'storage`,`middleware_cors с'имя зарегистрировано в междоменной промежуточного UploadCORS класс в <адрес>,`allow_origin установлен как доменное имя сервера приложений`http://www.your-domain.com'.
В файле`. env` измените элементы конфигурации 'APP_NAME' и 'APP_KEY' на соответствующие конкретные значения, соответствующие конфигурации сервера приложений. SESSION_DOMAIN=.your-domain.com измените конфигурацию SESSION_DRIVER=redis', чтобы поделиться сеансом.
** Простая в использовании команда ремесленника**
'php artisan upload: groups` перечисляет все группы и автоматически создает соответствующий каталог
'php artisan upload: build` перестраивает второй список пропусков файлов ресурсов в Redis
'php artisan upload: clean 2` очищает недопустимые временные файлы 2 дня назад
` php artisan upload:publish ' vendor:publish упрощенная команда, которая переопределяет публикацию некоторых каталогов и файлов
# Предложения по оптимизации
* (Рекомендуется) установите режим автоматической очистки недопустимых временных файлов каждый день.
Из - за неожиданного прекращения процесса загрузки, такого как принудительное закрытие страницы или браузера во время передачи, приведет к тому, что сгенерированная часть файла станет недействительными файлами, занимающими много места для хранения, мы можем использовать функцию планирования задач Laravel для периодической их очистки.
Запустите команду 'crontab-e' в Linux, чтобы убедиться, что эта строка кода включена в файл:
``в PHP
* * * * * php /абсолютный путь к корневому каталогу проекта/artisan schedule: run 1> > /dev / null 2>&1
在 'app/Console/Kernel.php' 中添加以下代码到 'schedule' 方法中: ``在PHP中 $schedule->command('upload:clean 2')->daily();
* (Рекомендуется) повысить эффективность чтения и записи заголовочных файлов.
Изменив файловую систему заголовочного файла с локального жесткого диска на Redis, можно повысить эффективность чтения и записи заголовочных файлов.
В конфигурации/загрузки.php 'изменяет соответствующее значение элемента 'header_storage_disk' на 'redis'.
В ' config/filesystems.добавить'redis'configuration к'item'disks РНР`:
``в PHP
"диски" => [
...
'в Redis' => [
'драйвер' => 'Redis с',
'disable_asserts'=>верно,
],
...
]
- 设置Redis每天自动重建二次扫描列表。错误的处理和一些极端情况可能导致二次扫描列表中出现脏数据,影响二次扫描函数的准确性。重建二次扫描列表可以清除脏数据,恢复与实际文件资源的同步。在Linux中运行 'crontab -e' 命令,确保以下代码包含在文件中: ``在PHP中
-
-
-
-
- php /绝对路径到项目根目录/artisan schedule:run 1>&1 /dev/null 2>&1
-
-
-
В ' app/Console / Kernel.добавьте следующий код к методу 'schedule' в php`:
``в PHP
$schedule->command('upload:build')->daily();
-
提高分块时间文件的读写速度(仅对PHP有效)。使用Linux的tmpfs文件系统,将加载的块时间文件加载到内存中,以实现快速读写,通过改变时间空间,提高读写效率,可释放约1个块大小的额外内存。将php配置文件中的临时目录项 'upload_tmp_dir' 设置为`"/dev/shm"`以重启fpm或apache服务。
-
提高块时间文件的读写速度(适用于系统临时目录)。使用Linux的tmpfs文件系统,将加载的块时间文件加载到内存中,以实现快速读写,通过改变时间空间,提高读写效率,可释放约1个块大小的额外内存。执行以下命令:
mkdir /dev/shm/tmp
chmod 1777 /dev/shm/tmp
mount --bind /dev/shm/tmp /tmp
兼容性
安全性
上传使用白名单+黑名单过滤文件扩展名,在下载前进行检查,然后检查上传文件的Mime类型。白名单直接限制保存文件的扩展名,黑名单默认屏蔽常见可执行文件扩展名,以防止恶意文件上传,安全白名单不能为空。
尽管做了很多安全工作,但无法完全防止恶意文件上传,建议正确设置上传目录的权限,以确保相关程序不会执行文件资源的权限。
变更日志
2021-01-04 v2.0.8 修复了执行route:cache时可能出现的错误,添加了关于Mime类型错误的警告,优化了js文件的合并
变更日志 CHANGELOG.md