sokil / php-upload
文件上传器
Requires
- php: >=5.3
- knplabs/gaufrette: >=0.2.0
Requires (Dev)
- phpunit/phpunit: >=3.7.38 <6.0
- satooshi/php-coveralls: >=0.7.1 <2.0
Suggests
- sokil/file-storage-bundle: Symfony bundle
README
安装
您可以通过 Composer 安装库
{ "require": { "sokil/php-upload": "dev-master" } }
相关包
- https://github.com/sokil/upload.js - 前端组件。实现页面不重新加载的文件上传和上传进度
- https://github.com/sokil/php-upload-sandbox - 测试后端(此库)和前端(https://github.com/sokil/upload.js)的沙箱。要开始测试,只需克隆存储库并启动服务器。
- https://github.com/sokil/FileStorageBundle - Symfony 扩展包
快速开始
首先创建 HTML
<input type="file" name="attachment" />
然后添加 PHP 代码到上传操作,将文件上传到本地系统
<?php $uploader = new \Sokil\Upload\Handler([ 'fieldName' => 'attachment', ]); $uploader->moveLocal(__DIR__ . '/uploads/');
此外,库还支持 Gaufrette 文件系统。有关 Gaufrette 的更多信息,请参阅 https://github.com/KnpLabs/Gaufrette。有关在 Symfony 中配置 Gaufrette 文件系统的更多信息,请参阅 https://github.com/KnpLabs/KnpGaufretteBundle。
将文件上传到 Gaufrette 文件系统
<?php $filesystem = new \Gaufrette\Filesystem(new \Gaufrette\Adapter\Local( __DIR__ . '/attachments/' )); $uploader = new \Sokil\Upload\Handler([ 'fieldName' => 'attachment', ]); $uploader->move($filesystem);
上传传输方式
流式上传
Nginx 上传
多部分表单数据传输
Nginx 配置
在标准上传过程中,文件会被移动到 PHP 的临时目录,然后使用 move_uploaded_file
移动到目标位置。如果这些目录在不同的物理驱动器上,将花费一些时间来在设备之间物理移动文件。
在 nginx + php-fpm 栈使用的情况下,还有另一个原因。在上传过程中,nginx 将文件存储到自己的临时目录。在将控制权传递给 php-fpm 后,nginx 将缓存文件移动到 PHP 的临时目录,然后 PHP 使用 move_uploaded_file
将文件移动到目的地。因此,文件被复制了三次,可能位于不同的物理设备上。
此方法直接将文件移动到配置的驱动器,因此在 PHP 代码中只需要重命名文件。
使用 upload_module 和 upload_progress_module (nginx < 1.3.9)
由于在 nginx 版本 1.3.9+ 上的 upload_module
编译错误,此方法已被弃用。
Nginx 必须编译这些模块
--add-module=/path/to/nginx-upload-module
--add-module=/path/to/nginx-upload-progress-module
处理上传和进度的 nginx 配置示例
upload_progress upload 5m;
server
{
location @php
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root/app.php;
include /etc/nginx/fastcgi_params;
}
location /upload
{
upload_pass @php;
upload_store %PATH_TO_STORAGE_DIRECTORY%;
upload_pass_args on;
upload_max_file_size 0;
upload_set_form_field $upload_field_name.name "$upload_file_name";
upload_set_form_field $upload_field_name.type "$upload_content_type";
upload_set_form_field $upload_field_name.tmp_name "$upload_tmp_path";
upload_aggregate_form_field $upload_field_name.size "$upload_file_size";
track_uploads upload 5s;
}
location /progress
{
report_uploads upload;
}
}
使用 client_body_in_file_only 指令
更多信息请参阅 https://nginx.ac.cn/en/docs/http/ngx_http_core_module.html#client_body_in_file_only
目前不支持