文件上传

未匹配的标注

上传

简介

很多时候,您需要上传用户图片,例如个人资料图片。 Masonite 让您非常优雅地处理此问题,并允许您直接将其上传到磁盘和 Amazon S3,开箱即用。UploadProvider 服务提供者是添加此功能的要素。Masonite 支持直接上传到文件系统的 disk 驱动程序和直接上传到 Amazon S3 存储桶的 s3 驱动程序。

如果您想扩展 Masonite 的功能,则可以构建更多的驱动程序。如果您确实创建了驱动程序,请考虑使其在 PyPi 上可用,以便其他人可以将其安装到他们的项目中。

有关如何创建驱动程序的详细信息,请阅读 「创建电子邮件驱动程序」。另请查看MasniteFramework/core 存储库中的 driver 目录。

配置

所有上传配置设置都在 config/storage.py 中。与文件上传有关的设置只是 DRIVERDRIVERS 配置项。

DRIVER 和 DRIVERS 设置

此设置如下所示:

DRIVER = os.getenv('STORAGE_DRIVER', 'disk')

默认为 disk 驱动程序。磁盘驱动程序将直接上传到文件系统上。该驱动程序仅需要一个设置,即location 设置,可以将其放入 DRIVERS 词典中:

DRIVERS = {
    'disk': {
        'location': 'storage/uploads'
    }
}

这将把所有图片上载到 storage/uploads 目录。如果您更改此目录,请确保该目录存在,因为Masonent 在上传之前不会为您创建。要知道 DRIVERS 中的设置应与您的 DRIVER 有关。例如,要 DRIVER 设置为 s3,如下所示:

DRIVER = 's3'

DRIVERS = {
    'disk': {
        'location': 'storage/uploads'
    },
    's3': {
        'client': os.getenv('S3_CLIENT', 'AxJz...'),
        'secret': os.getenv('S3_SECRET', 'HkZj...'),
        'bucket': os.getenv('S3_BUCKET', 's3bucket'),
    }
}

有些部署平台是临时的。这意味着,无论每小时还是每天,他们都将完全清理其文件系统,这将导致您删除部署在文件系统上的任何内容。换句话说,所有用户上传的内容都会被清除。要解决此问题,您需要将图像上传到 Amazon S3 或其他资产托管服务,这就是 Masonite 开箱即用提供 Amazon S3 功能的原因。

基于类的驱动程序

您也可以将驱动程序明确声明为类:

from masonite.drivers import UploadS3Driver

DRIVER = UploadS3Driver

上传

用 masonite 上传非常简单。我们可以使用 Upload 类,该类通过 UploadProvider 服务提供者加载到容器中。无论何时上传文件,我们都可以使用常规的 request.input() 方法检索它。这看起来像:

<html>
    <body>
    <form action="/upload" method="POST" enctype="multipart/form-data">
        <input type="file" name="file_upload">
    </form>
    </body>
</html>

在我们的控制器内部,我们可以执行以下操作:

from masonite import Upload

def upload(self, upload: Upload):
    upload.driver('disk').store(request.input('file_upload'))

就是这样!我们指定了要使用的驱动程序,然后将图像上传到了文件系统。

此操作将返回文件名。如果需要,我们可以把它来存入数据库。所有上传的文件都会将文件名转换为一个长度为 25 的随机字符串。

upload.driver('disk').store(request.input('file_upload'))
#== '838nd92920sjsn928snaj92gj.png'

最后,我们可以直接使用 filename 关键字参数指定文件名:

upload.driver('disk').store(request.input('file_upload'), filename="username.profile")
#== username.profile.png

接受特定文件

默认情况下,Masonite 出于安全原因仅允许上传接受的图像,但是您可以在调用 store 方法之前通过在 accept 方法中指定文件类型来配置要接受的任何类型。

upload.accept('yml', 'zip').store('some.yml')

您也可以接受所有文件类型:

upload.accept('*').store('some.yml')

上传文件

您可以通过传入文件到 open() 来直接上传文件:

from masonite import Upload

def upload(self, upload: Upload):
    upload.driver('disk').store(open('some/file.txt'))

这会直接将文件从文件系统上传到需要的任何位置。

位置

您还可以指定要上传的位置。这将默认为配置文件中指定的位置,但我们可以随时更改它:

upload.driver('disk').store(request.input('file_upload'), location='storage/profiles')

点表示法

您可以使用点符号来搜索驱动程序位置。以下为配置示例:

DRIVERS = {
    'disk': {
        'location': {
            'uploads': 'storage/uploads',
            'profiles': 'storage/users/profiles',
    }
}

您可以使用点表示法:

upload.driver('disk').store(request.input('file_upload'), location='disk.profiles')

上传到 S3

在开始上传到 Amazon S3 之前,您需要 boto3 库:

$ pip install boto3

上传到 S3 完全相同。只需将您的用户名,密钥和存储桶添加到 S3 设置中:

DRIVER = 's3'

DRIVERS = {
    'disk': {
        'location': 'storage/uploads'
    },
    's3': {
        'client': os.getenv('S3_CLIENT', 'AxJz...'),
        'secret': os.getenv('S3_SECRET', 'HkZj...'),
        'bucket': os.getenv('S3_BUCKET', 's3bucket'),
    }
}

确保您的用户具有上传到 S3 存储桶的权限。

然后在我们的控制器中:

from masonite import Upload

def upload(self, upload: Upload):
    upload.store(request.input('file_upload'))

S3 驱动程序当前的工作方式是使用 disk 驱动程序上载到文件系统,然后将该文件上载到 Amazon S3 存储桶。因此,请勿删除 DRIVERS 词典中的 disk 设置。

更改驱动程序

您还可以动态交换驱动程序:

from masonite import Upload

def upload(self, upload: Upload):
    upload.driver('s3').store(request.input('file_upload'))

或者您可以显式指定类:

from masonite.drivers import UploadS3Driver
from masonite import Upload

def upload(self, upload: Upload):
    upload.driver(UploadS3Driver).store(request.input('file_upload'))

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
Summer
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~