django restframework+fastdfs 或者Minio实现django自定义存储,上传文件

fastdfs client库windows调用报错报错坑1:

ModuleNotFoundError: No module named 'mutagen._compat'
解决办法:找到utils.py文件修复导入报问题如下:
from mutagen._senf._compat import StringIO

 

 

坑2:进行settings.py client.conf配置路径settings.FASTDFS_CLIENT_CONF引入报错,实际上我已经配置了在settings.py很狗血:

 Requested setting , but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

解决办法:

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mall.settings')

 

坑三:  fastdfs 使用方法client.upload_by_file()报错Error: 'sendfile' system call only available on linux.此方法只能在linux系统使用windows使用错误

client=Fdfs_client(conf_path=conf)
client.upload_by_file()

解决办法:使用client.upload_by_buffer(data.read())方法调试:

1
2
3
4
5
6
7
8
9
conf=settings.FASTDFS_CLIENT_CONF
client=Fdfs_client(conf_path=conf)
with open('hi.png','rb')as data:
    ret=client.upload_by_buffer(data.read())
    print(ret)
    if ret.get("Status")!="Upload successed.":
        raise Exception('fastdfs upload failed !!!')
    file_name = ret.get("Remote file_id")
    print(file_name)

 fastdfs 自定义存储实现如下:

  

 

接下来,使用drf编写模型类,序列化器以及view视图测试代码:

model如下:

1
2
3
4
5
6
7
class FileModels(models.Model):
    file_id=models.AutoField(primary_key=True,max_length=200)
    file=models.FileField()
 
    class Meta:
        db_table='tbl_file'
        verbose_name='文件测试'

 

序列化器如下:

1
2
3
4
5
6
7
8
from rest_framework import serializers
from .models import FileModels
 
 
class SerialFiles(serializers.ModelSerializer):
    class Meta:
        model = FileModels
        fields = "__all__"

 

视图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class FileView(APIView):
 
    def post(self, request, *args, **kwargs):
            print(request.POST)
            print(request.data)
            ser = SerialFiles(data=request.data, many=False)
            if ser.is_valid():
                ser.save()
                return Response(data=ser.data, status=status.HTTP_200_OK)
            else:
                return Response(data=ser.errors, status=status.HTTP_404_NOT_FOUND)
 
    def get(self,request, *args, **kwargs):
        inst=FileModels.objects.all()
        ser=SerialFiles(instance=inst,many=True)
 
        return Response(data=ser.data)

 

注意事项起初,我用postman form-data 上传一直报参数f不存在,匪夷所思,怀疑是没有指明使用muti-formdata导致的,于是使用html写个简单的上传表单提交文件,果然

 

 

最后点击上传可以看到页面返回:

 

 

 

最后送上我的表单html上传文件基于 enctype=

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1><div align=center style="color:green" display="block"> hello world </div><p> this is a first text for test web page and we will sart from hello </p></h1>
<form action="http://127.0.0.1:8000/file/" method="post" enctype="multipart/form-data">
    
    <input type="file"  name='file'>
    <!--input type="file"  name='file22'-->
    <!--input type="username"  name='username'-->
    <!--input type="password"  name='password'-->
     <!--input type="file"  accept=".xlsx"-->
    <input type="submit" value="提交">
 
</form>
</body>
&copy codemao
</html>

 

结语:其实自定义文件储存,在企业使用是非常多的oss,fastdfs,minio ,qiniu云,腾讯cos等等,django默认自带FilesystemStorage,实现一般存在django项目所在服务器时间久了影响磁盘空间以及性能,企业很少这样做实际开发

关于minio自定义存储可以这样:

可能遇到的坑:

第一:settings 定义MINIO_CONF找不到,我用的django2.2,好像必须要大写变量在settings

事实上我已经导入了

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mall.settings')

坑2:save方法返回name是文件名,不然找不到,其次我在上传minio是object_name修改了用了uuid加随机字符串避免多用户使用上传文件名相同覆盖问题

 

送上settings配置:

DEFAULT_FILE_STORAGE='utils.minio_fdfs.minio_storage.MinioStorage'
MINIO_CONF = {
'endpoint': '192.168.110.151:9000',
'access_key': 'admin',
'secret_key': 'admin123456',
'secure': False
}
BUCKET_NAME='mybucket'

 

  

 

 

 

去minio查看上传情况:

 下一篇docker 部署minio(https://www.cnblogs.com/SunshineKimi/p/13975581.html),对比了下fastdfs,我还是喜欢minio,真的很爽:

数据库存储可以带文件拓展名;第一条是minio,第二条fastdfs

 

posted @   不带R的墨菲特  阅读(1319)  评论(5编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
历史上的今天:
2019-11-15 读写json文件
点击右上角即可分享
微信分享提示