文件上传
上传
简介
很多时候,您需要上传用户图片,例如个人资料图片。 Masonite 让您非常优雅地处理此问题,并允许您直接将其上传到磁盘和 Amazon S3,开箱即用。UploadProvider
服务提供者是添加此功能的要素。Masonite 支持直接上传到文件系统的 disk
驱动程序和直接上传到 Amazon S3 存储桶的 s3
驱动程序。
如果您想扩展 Masonite 的功能,则可以构建更多的驱动程序。如果您确实创建了驱动程序,请考虑使其在 PyPi 上可用,以便其他人可以将其安装到他们的项目中。
有关如何创建驱动程序的详细信息,请阅读 「创建电子邮件驱动程序」。另请查看MasniteFramework/core
存储库中的 driver
目录。
配置
所有上传配置设置都在 config/storage.py
中。与文件上传有关的设置只是 DRIVER
和 DRIVERS
配置项。
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'))
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。