准备:
因为在 python 的资源库里是 pip install 不到这个 Fastdfs_client 的
我们需要自己准备这个
还需要 一个
fdfs.conf 连接的文件
fdfs.conf文件
将这个文件 存放到 Python 的第三方资源库里
我们找到 Python 打开Lib
然后打开 site_packages 文件
然后 再把 Faskdfs 粘贴到 这里 就好了
fdfs.conf:
开工:
首先 我们打开 我们的 Pycharm 工具 新建一个 Storag.py 文件
因为 我的 这个操作 是在项目中我完成的 所以 放在了 Django 的 子应用中
如图:
打开它 重写 storage 文件
from django.core.files import storage
from shiyanlou.settings import BASE_DIR
from fdfs_client.client import Fdfs_client
import os
''' 导入 storage 存储文件模块 '''
导入 django 的 storage
模块 它的作用 就是 文件的 操作 我们对他 进行重写
导入 BASE_DIR
作用就是 把 fdfs_conf 导入进来
导入了文件之后 需要把 os 也导入进来
导入 os
导入Fafs_client 模块(这个就是刚才 手动安装的那个)
class FastDFSStorage(storage.Storage):
# 重写方法 标明 配置 和 端口 都对应上 自己的
def __init__(self):
self.conf = os.path.join(BASE_DIR, 'fdfs.conf')
self.host = 'http://47.96.158.77:8888/'
def open(self, name, mode='rb'):
pass
定义一个 类名 继承的 是 Storage 因为 要重写他 里面的方法
给大家 看一下 Storage 的源码
( 这里 可以跳过啊 !!!)
class Storage:
def open(self, name, mode='rb'):
return self._open(name, mode)
def save(self, name, content, max_length=None):
if name is None:
name = content.name
if not hasattr(content, 'chunks'):
content = File(content, name)
name = self.get_available_name(name, max_length=max_length)
return self._save(name, content)
def get_valid_name(self, name):
return get_valid_filename(name)
def get_available_name(self, name, max_length=None):
dir_name, file_name = os.path.split(name)
file_root, file_ext = os.path.splitext(file_name)
while self.exists(name) or (max_length and len(name) > max_length):
name = os.path.join(dir_name, "%s_%s%s" % (file_root, get_random_string(7), file_ext))
if max_length is None:
continue
truncation = len(name) - max_length
if truncation > 0:
file_root = file_root[:-truncation]
if not file_root:
raise SuspiciousFileOperation(
'Storage can not find an available filename for "%s". '
'Please make sure that the corresponding file field '
'allows sufficient "max_length".' % name
)
name = os.path.join(dir_name, "%s_%s%s" % (file_root, get_random_string(7), file_ext))
return name
def generate_filename(self, filename):
dirname, filename = os.path.split(filename)
return os.path.normpath(os.path.join(dirname, self.get_valid_name(filename)))
def path(self, name):
raise NotImplementedError("This backend doesn't support absolute paths.")
def delete(self, name):
raise NotImplementedError('subclasses of Storage must provide a delete() method')
def exists(self, name):
raise NotImplementedError('subclasses of Storage must provide an exists() method')
def listdir(self, path):
raise NotImplementedError('subclasses of Storage must provide a listdir() method')
def size(self, name):
raise NotImplementedError('subclasses of Storage must provide a size() method')
def url(self, name):
raise NotImplementedError('subclasses of Storage must provide a url() method')
def get_accessed_time(self, name):
raise NotImplementedError('subclasses of Storage must provide a get_accessed_time() method')
def get_created_time(self, name):
raise NotImplementedError('subclasses of Storage must provide a get_created_time() method')
def get_modified_time(self, name):
raise NotImplementedError('subclasses of Storage must provide a get_modified_time() method')
这里有 very 多的 方法 我只需要用到几个就可以了
源码可知 先实例一些 必要的参数
有我们想要存储连接的 fdfs_conf 文件 他起到的就是连接的作用
然后上传的端口 这里的 IP 我用的是 我 阿里云的公网 IP,
后面的 端口我用的是 8888
这个要和 阿里云 创建的安全组一致就可以
```python
在这里插入代码片
def open(self, name, mode='rb'):
pass
# 重写 save() 方法
def _save(self, name, content, max_length=None):
c = Fdfs_client(self.conf)
res = c.upload_by_buffer(content.read())
# buffer 缓冲 上传文件
print(res)
if res.get('Status') == 'Upload successed.':
return res['Remote file_id']
raise Exception('upload failed')
def url(self, name):
return self.host + name
def exists(self, name):
return False
代码 就简单了
实例化 参数、建立一个连接对象
使用 它里面的 upload_by_buffer 进行上传 ( 将文件内容读出来 )
我们打印出来 看一下 结果是什么 ↓
{
'Group name': 'group1', 'Remote file_id': 'group1\\M00/00/00/rBA5E12NZraAGKMZAAC9fPLwID08601545', 'Status': 'Upload successed.', 'Local file name': '', 'Uploaded size': '47.00KB',
重写他 、发现里面的 东西 都是变量、直接 save 的保存 太 low 了、发现这里面有一个 Status 的键、他返回的是文件的状态、如果 文件没问题 就代表 成功 我们用它当作判断条件、如果失败 我就 给他生成一个 异常 ‘upload failed’ 、
然后 定义他的 url 、这里很关键! 存入数据库的文件、
如:图片 这样子拼接 前台才会展示出来
def url(self, name):
return self.host + name
已经重写 OK 、我们放到 settings 配置文件里把
让 默认 上传文件 使用的就是 Fastdfs
settings.py ↓
# 文件引擎
DEFAULT_FILE_STORAGE = 'online.storage.FastDFSStorage'
再 设置 一下 阿里云的安全组
配置 这两个
(为什么 要配置 阿里云 呢 因为 要熟悉 用它、用自己的 本机地址 会感觉 很low
我现在才发现 发送的 文件 浏览下载 要 花钱啊
我截个图把 — 就是 上面说的 那个 fdfs.conf)
大家可以看到 这个
# "这个 47.96.158.77 是我的 阿里云 公网IP 22122 是必须要写的 这个是 tracker"
tracker_server = 47.96.158.77:22122
刚才我们用的 fastdfs 是 client 的 、引入的方法 是 fastdfs_client 的 这个 conf 配置 直接 写好了 连接 fastdfs_server 、这个时候 我们 在 docker上下载 一个 fastdfs 的tracker跟踪器 和 storage存储节点就ok了
当 代码写到这里的时候 就代表着、文件的路径 从 fastdfs 的客户端 到 服务端了,接下来的事情就是 在 docker 安装服务端,就结束了
在这里 我 用的是 ATOM 编辑器 来查看 阿里云的 文件
因为 Atom 跨平台 本热比较青睐、
然后、给大家看一下、如何配置的 Atom连接阿里云
随便起一个项目名称、配置文件、写上阿里云的、公网、名称、密码、端口 写 22
( 老大看见我的项目名字 可别打我 )
然后 创建这个Create SFTP
connect 在连接
先说一下最后的文件是存储在 var/fdfs/storage/data/00/00
如果 没 安装 docker 的化
请继续看
docker
创建容器
sudo docker run [option] 镜像名
-i 表示以“交互模式”运行容器
-t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即 分配一个伪终端。
–name 为创建的容器命名
-v 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录,即 宿主机目录:容器中目录),可以使 用多个-v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后 共享到容器上。
-d 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不 会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。
-p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p 做多个端口映射
-e 为容器设置环境变量
–network=host 表示将主机的网络环境映射到容器中,容器的网络与主机相同
停止或启动容器
docker container stop 容器名或ID
FastDFS
- FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制, 充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务
- FastDFS架构包括 Tracker server 和 Storage server。客户端请求Trackerserver进行过文件上传、下载
- 通过
Tracker server
调度最终由Storage server完成文件上传、下载
- 通过
- Tracker server
- 作用是负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将tracker称为追踪服务器或 调度服务器
- Storage server
- 作用是文件存储,客户端上传的文件最终存储在Storage存储器上,Storageserver没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。可以将storage称为存储服务器
centos部署docker
- 安装docker
yum -y install yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 添加docker-repo源
yum install docker-ce
# 尝试安装docker-ce
yum erase docker-common-2:1.13.1-96.gitb2f74b2.el7.centos.x86_64
# 删除已安装的docker
- 开启docker服务
systemctl start docker
- 查看docker镜像
- REPOSITORY:镜像所在的仓库名称
- TAG:镜像标签
- IMAGEID:镜像ID
- CREATED:镜像的创建日期(不是获取该镜像的日期)
- SIZE:镜像大小
docker image ls
docker rm
- 拉取镜像及删除镜像
sudo docker image pull delron/fastdfs
上面代码中,docker image pull是抓取 image 文件的命令。delron/fastdfs是 image 文件在仓库里面的位置,其中delron是 image 文件所在的组,fastdfs是 image 文件的名字
- 开启fastdfs的tracker服务 (如果没有就下载一个)
docker run -dti --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker
- 开启fastdfs的storage服务
- 填写的是 阿里云公网IP哦 要和之前的对应上
docker run -dti --network=host --name storage -e TRACKER_SERVER=47.96.158.77:22122 -v /var/fdfs/storage:/var/fdfs delron/fastdfs storage
- 关闭docker容器
docker stop container_id
- 查看当前运行的容器
docker container ls
安装的文件 就这些 不想看的 就都执行一遍
一切的一切 都 准备 OK 了
发一个文件 试一下吧、最简单的 因为 我用的是 Django、就创建 一张 带有 图片字段的表格 然后再通过 Django 超级管理员 添加进去 查看一下 就 OK 了
class Image_(models.Model):
img = models.ImageField(upload_to='course/', verbose_name='图片地址')
然后在 admin 下 注册一下
在这里插入代码片rom django.contrib import admin
# Register your models here.
from . models import *
admin.site.register(Image_)
数据库迁移
python manage.py makemigrations
python manage.py migrate
超级管理员添加
最后 回到 Atom 查看文件是否存在
全体起立
收工–…
回顾一下 流程
引入 fastdfs_client 重写 Django 默认 storage 存储位置、更改到 docker 上,docker 下载 fastdfs 的 storage 和 tracker 服务端的容器 ,
( ???为什么下载服务端啊,因为他就是服务端 进行的连接,当然 fastdfs 的 文件操作当然是用服务端 )
在 conf 文件 对 faftdfs 客户端连接服务端 文件发送到 docker 的faftdfs_server/stroage 里面进行存储 、
最后的最后 他们都是建立在 阿里云的 公网 IP 进行的哦
当然 你也可以使用自己的 本机地址 微软粉 下载 winDocker 就可以
打字辛苦希望 给个赞 哈哈哈
在 cmd 下输入
CHCP 65001 即可将 windows 编码转换为 utf8
今天的文章django rest framework上传文件_纯html5上传文件分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/89677.html