之前在这篇写过,对 pathlib 的学习,慢慢地就想使用 pathlib 了 而且下面的介绍,附带了不使用 django 的 imagefield 而多图上传的方法

pathlib 以面对对象的风格冲走了我内心的 os 以及 with..open

for img in request.data.getlist('images'):
    get_type = request.data.get('types', '')
    # 获取文件后缀名
    form = pathlib.PurePosixPath(img.name).suffix
    if form not in ['.jpg', '.png', '.bmp', '.gif', '。webp', '.svg']:
        return Response({'error': f'不允许上传{form}类型'}, status=status.HTTP_401_UNAUTHORIZED)
    save_path = pathlib.Path(settings.MEDIA_ROOT) / get_type / f'{uuid.uuid4().hex}{pathlib.Path(form)}'
    if not pathlib.Path(settings.MEDIA_ROOT).is_dir():
        pathlib.Path(settings.MEDIA_ROOT).mkdir(parents=True)
    for content in img.chunks():
        save_path.write_bytes(content)
        ready_save.append((pathlib.Path(settings.MEDIA_URL) / get_type /
                            f'{save_path.name}').as_posix())
        save_path = pathlib.Path(settings.MEDIA_ROOT) / get_type / f'{uuid.uuid4().hex}{pathlib.Path(form)}'

写入文件,具体是 write_bytes 写入二进制文件,相当于'wb'

其实还有个 write_text 相当于'w',可以写入文本

但是用 pathlib 创建文件读写文件的时候有个坑

那就是如果最后一个目录(1.png)也 mkdir(parents=True) 后的只能是文件夹,写入是没有作用的。

因为 pathlib 还有个方法 touch 是创建文件的,你可以先 touch 创建好文件

或者就像我这样,有目录了,再直接读写,因为没有经过 mkdir,所以不会认为只是目录