Django+Vue实现文件上传下载的项目实践

 更新时间:2023年06月07日 11:27:26   作者:穿越寒冬  
本文主要介绍了Django+Vue实现文件上传下载的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

首先我要实现的页面效果是这样的

 当点击上传文件按钮,弹出上传文件的弹出框,可以上传多个文件,点击确定后才正式开始上传

 点击右侧下载按钮,可以直接下载文件。

上传功能

后端代码

settings.py

MEDIA_ROOT = os.path.join(BASE_DIR, '../upload')
MEDIA_URL = '/upload/'

这段代码表示你上传的文件都会放在你项目根目录的upload文件夹下。

views.py

@api_view(('POST',))
@renderer_classes((TemplateHTMLRenderer, JSONRenderer))
def upload_list(request):
    # 如果项目根目录没有upload文件夹,会自动给你创建一个
    folder_path = settings.MEDIA_ROOT
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)
    files = request.FILES.getlist('file')
    for file in files:
        # 这三行代码就是上传文件的代码
        f = open(settings.MEDIA_ROOT + "/" + file.name, mode='wb')
        for chunk in file.chunks():
            f.write(chunk)
        # 这段代码是我要网数据库里存的一些文件信息,如果不存库的话不用写
        size = file.size
        suffix = file.content_type
        createUser = request.user
        filePath = settings.MEDIA_URL + file.name
        name = file.name
        # 上传完文件记得要关闭
        # 需要注意的一点,如果f.close()这句代码之前,上传文件之后有报错,那你文件是一直被占用的状态,删除也删不掉,所以一定要做好代码顺序
        f.close()
        # 往数据库里存文件信息
        Filemanage.objects.create(size=size, suffix=suffix, create_user=createUser, file_path=filePath, name=name)
    return JsonResponse(OrderedDict([
        ('results', {})
    ], code=status.HTTP_200_OK))

前端代码

<el-upload
          class="upload-demo"
          ref="upload"
          action=""
          :auto-upload="false"
          :http-request="upload"
          :before-upload="beforeAvatarUpload"
          multiple
        >
          <el-button size="small" type="primary">点击上传</el-button>
        </el-upload>

:ref="upload":必须要写,因为我们是手动上传方式。

:auto-upload="false":这里我设置的不自动上传,如果你没有确定按钮,点击一起上传的需求,那你就把值变为ture,你选完文件后会自动上传。

:http-request="upload":覆盖默认的上传行为,可以自定义上传的实现。

:before-upload="beforeAvatarUpload":上传文件之前的钩子,一般用于限制上传文件大小和类型。

multiple:多文件上传。

methods: {
    beforeAvatarUpload(file) {
        const isLt2M = file.size / 1024 / 1024 < 200;
        if (!isLt2M) {
            this.$message.error('上传头像图片大小不能超过2MB!');
        }
        return isLt2M;
    },
    upload(param) {
        const formData = new FormData()
        formData.append('file', param.file)
        mail.uploadFile(formData).then(response => {
            console.log('上传图片成功')
            this.$refs.upload.clearFiles()
        }).catch(response => {
            console.log(response)
            this.$refs.upload.clearFiles()
        });
    },
}

下载功能

后端代码

def download(request, nid):
    # 通过前台传来的id查出文件名
    row_object = Filemanage.objects.filter(id=nid).first()
    # 文件的相对路径
    file_path = '/upload/' + row_object.name
    # 打开文件
    with open(settings.MEDIA_ROOT + "/" + row_object.name, 'rb') as f:
        response = HttpResponse(f.read())
    # 设置Content-Disposition头以强制浏览器下载文件
    file_name = os.path.basename(file_path)
    response["Content-Type"] = "application/octet-stream"
    response['Content-Disposition'] = f'attachment; filename="{file_name}"'
    return response

前端代码

<el-button
  v-if="permissionList.del"
  size="small"
  type="success "
  @click="download(row)"
>{{ "下载" }}</el-button>
methods: {
    download(row) {
	    this.loading = true;
        // 这块是我封装的axios请求,请求时要带着responseType: 'blob',我会在下面放上我的代码
	    file.requestDownload(row.id).then((response) => {
	      const url = window.URL.createObjectURL(new Blob([response.data]));
	      const link = document.createElement('a');
	      link.href = url;
	      link.setAttribute('download', row.name);
	      document.body.appendChild(link);
	      link.click();
	    })
	    .catch((e) => {
	      console.log(e)
	    });
    },
}
requestDownload(id) {
    return request({
      url: '/tool/download/' + id + '/',
      method: 'get',
      responseType: 'blob'
    })
}

 到此这篇关于Django+Vue实现文件上传下载的项目实践的文章就介绍到这了,更多相关Django Vue文件上传下载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • pandas中的.assign()方法的用法示例小结

    pandas中的.assign()方法的用法示例小结

    pandas中的.assign()方法用于创建一个新的DataFrame,其中包含现有DataFrame的副本,并附加了指定的新列或更新了现有列,.assign()方法还可以链式使用,以添加多个新列或更新现有列,对pandas中的.assign()方法感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • Python利用wxPython模块打造ChatGPT式打字效果程序

    Python利用wxPython模块打造ChatGPT式打字效果程序

    这篇文章主要为大家介绍了如何利用Python和wxPython模块打造一个ChatGPT式打字效果程序,从而增强用户体验或提高应用程序的可读性,感兴趣的可以了解一下
    2023-05-05
  • 布同自制Python函数帮助查询小工具

    布同自制Python函数帮助查询小工具

    Python的自带文档功能很不错,给与我耳目一新的感觉。如果在CMD中进行“行式编程”编程的话,可以随时随地的查询函数的功能,非常方便。
    2011-03-03
  • 如何保证Python代码质量,Python测试与调试方面的经验和心得

    如何保证Python代码质量,Python测试与调试方面的经验和心得

    本文分享了作者在学习Python测试与调试方面的经验和心得,涵盖了Python测试框架(如unittest、pytest)、测试覆盖率、单元测试、集成测试、调试技巧、异常处理等内容,还对比了Python与Rust在测试和调试方面的差异
    2026-05-05
  • Python中使用kitti数据集实现自动驾驶(绘制出所有物体的行驶轨迹)

    Python中使用kitti数据集实现自动驾驶(绘制出所有物体的行驶轨迹)

    这篇文章主要介绍了Python中使用kitti数据集实现自动驾驶——绘制出所有物体的行驶轨迹,本次内容主要是画出kitti车的行驶的轨迹,需要的朋友可以参考下
    2022-06-06
  • 使用Python创建读取和修改Word文档

    使用Python创建读取和修改Word文档

    Python凭借其简洁语法和丰富的生态工具链,是实现文档自动化处理的理想工具,本文将介绍如何使用Python实现Word文档的创建,读取及修改,需要的可以了解下
    2025-02-02
  • python内置HTTP Server如何实现及原理解析

    python内置HTTP Server如何实现及原理解析

    这篇文章主要为大家介绍了python内置HTTP Server如何实现及原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • flask 框架操作MySQL数据库简单示例

    flask 框架操作MySQL数据库简单示例

    这篇文章主要介绍了flask 框架操作MySQL数据库,结合实例形式详细分析了flask框架操作MySQL数据库的连接、表格创建、数据增删改查等相关使用技巧,需要的朋友可以参考下
    2020-02-02
  • python交互式图形编程实例(一)

    python交互式图形编程实例(一)

    这篇文章主要为大家详细介绍了python交互式图形编程实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • 关于win10在tensorflow的安装及在pycharm中运行步骤详解

    关于win10在tensorflow的安装及在pycharm中运行步骤详解

    这篇文章主要介绍了关于win10在tensorflow的安装及在pycharm中运行的步骤详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03

最新评论