django rest framework上传文件_纯html5上传文件

django rest framework上传文件_纯html5上传文件#project/client.conf#connecttimeoutinseconds#defaultvalueis30sconnect_timeout=1000#networktimeouti

准备:

因为在 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 存储文件模块 '''
导入 djangostorage

模块 它的作用 就是 文件的 操作 我们对他 进行重写

导入 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

刚才我们用的 fastdfsclient 的 、引入的方法 是 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 serverStorage 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 下载 fastdfsstoragetracker 服务端的容器 ,
( ???为什么下载服务端啊,因为他就是服务端 进行的连接,当然 fastdfs 的 文件操作当然是用服务端 )
conf 文件 对 faftdfs 客户端连接服务端 文件发送到 dockerfaftdfs_server/stroage 里面进行存储 、
最后的最后 他们都是建立在 阿里云的 公网 IP 进行的哦
当然 你也可以使用自己的 本机地址 微软粉 下载 winDocker 就可以

打字辛苦希望 给个赞 哈哈哈

在 cmd 下输入
CHCP 65001 即可将 windows 编码转换为 utf8

今天的文章django rest framework上传文件_纯html5上传文件分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/89677.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注