sokil/php-upload

文件上传器

0.7.0 2019-12-02 21:43 UTC

This package is auto-updated.

Last update: 2024-08-29 03:10:43 UTC


README

Latest Stable Version Build Status Coverage Status

安装

您可以通过 Composer 安装库

{
    "require": {
        "sokil/php-upload": "dev-master"
    }
}

相关包

快速开始

首先创建 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

目前不支持