vue与django(drf)实现文件上传下载功能全过程

yizhihongxing

下面我将介绍通过Vue和Django(DRF)实现文件上传下载功能的全过程,包含以下几个步骤:

  1. 在Vue中创建文件上传表单并发送请求到Django后端;
  2. 在Django后端接收文件并保存到指定目录;
  3. 编写Django视图函数实现文件下载功能;
  4. 在Vue中调用视图函数完成文件下载。

1. 创建Vue文件上传表单并发送请求到Django后端

我们可以使用 axios 库发送文件上传请求。在表单处理方法中,我们需要创建一个FormData对象来存储文件数据,并调用axios发起POST请求。

以下是一个示例,上传表单中包含一个文件选择按钮和一个提交按钮:

<template>
  <div>
    <form @submit.prevent="uploadFile" enctype="multipart/form-data">
      <label for="file-upload">选择文件:</label>
      <input type="file" id="file-upload" ref="fileUpload" />
      <button type="submit">上传文件</button>
    </form>
  </div>
</template>

<script>
import axios from 'axios'

export default {
  methods: {
    async uploadFile() {
      const file = this.$refs.fileUpload.files[0]
      const formData = new FormData()
      formData.append('file', file)
      const response = await axios.post('/api/upload/', formData)
      console.log(response.data)
    }
  }
}
</script>

在上面的示例中,我们使用了async/await语法来让方法异步执行,同时也使用了axios库来发起POST请求。在FormData对象的append方法中,我们指定了文件上传时使用的字段名为'file'。POST请求的URL为'/api/upload/',该URL需要在Django后端进行路由绑定。

在Django的settings.py文件中,还需要添加如下配置以允许文件上传:

FILE_UPLOAD_HANDLERS = [
    'django.core.files.uploadhandler.MemoryFileUploadHandler',
    'django.core.files.uploadhandler.TemporaryFileUploadHandler',
]

2. 在Django后端接收文件并保存到指定目录

我们可以使用DRF提供的视图来处理文件上传请求。在视图函数中,我们可以使用request.FILES属性来获取上传的文件数据,并调用文件对象的save方法将文件保存到指定目录中。在保存文件的同时,我们可以通过HttpResponse返回包含上传文件路径的JSON数据。

以下是一个示例:

from django.conf import settings
from django.core.files.storage import FileSystemStorage
from django.http import HttpResponse
from rest_framework.decorators import api_view

@api_view(['POST'])
def upload_file(request):
    if request.method == 'POST' and request.FILES.get('file'):
        file = request.FILES['file']
        fs = FileSystemStorage(location=settings.MEDIA_ROOT)
        filename = fs.save(file.name, file)
        file_url = fs.url(filename)
        return HttpResponse({'file_url': file_url})

在上面的代码中,我们使用DRF框架提供的@api_view装饰器将该函数转换为Django视图函数。在request.FILES属性中,我们获取了上传的文件数据。然后,我们使用FileSystemStorage类初始化一个存储文件的对象,并使用save方法将文件保存到设置文件中MEDIA_ROOT指定的目录下。最后,我们通过HttpResponse返回一个JSON对象,其中包含文件的URL地址。

3. 编写Django视图函数实现文件下载功能

当需要下载文件时,我们可以定义一个Django的视图函数,该函数将从服务器提供的文件地址获取文件内容并以HTTP响应的方式返回给客户端浏览器。在文件下载视图函数中,我们首先需要获取要下载文件的路径,然后将该文件以二进制形式打开,并进行读取操作,最后将该文件以HttpResponse的方式返回给客户端。

以下是一个示例:

from django.http import HttpResponse

def download_file(request, file_url):
    # 根据文件URL获取文件路径
    file_path = file_url.replace('/media/', settings.MEDIA_ROOT + '/')
    with open(file_path, 'rb') as f:
        # 将文件以二进制形式读取
        file_data = f.read()
    response = HttpResponse(file_data, content_type='application/octet-stream')
    # 设置响应头,告诉浏览器返回的是附件,并指定文件名
    response['Content-Disposition'] = 'attachment; filename={}'.format(file_url.split('/')[-1])
    return response

在上面的代码中,我们定义了一个download_file视图函数,其参数为file_url。在该函数中,我们首先根据参数值获取真实的文件路径,然后以二进制形式读取文件内容,并将其返回给客户端。在返回时,我们设置了content_type为'application/octet-stream',告诉浏览器返回的是二进制流,同时在响应头中自定义了'Content-Disposition'参数,告诉浏览器返回的是附件并指定文件名。

4. 在Vue中调用视图函数完成文件下载

在Vue中,我们可以使用a标签来实现文件下载。以下是一个示例,该示例中定义了一个downloadFile方法,该方法被调用时将用户浏览器重定向到Django视图函数中指定的URL地址,从而完成文件下载。

<template>
  <div>
    <button @click="downloadFile(fileUrl)">下载文件</button>
  </div>
</template>

<script>
export default {
  methods: {
    downloadFile(fileUrl) {
      window.location.href = `/api/download/${fileUrl}`
    }
  }
}
</script>

在上面的示例中,我们使用了a标签,通过URL地址的方式来定位Django视图函数并进行文件下载。当下载按钮被点击时,我们调用了downloadFile方法,并将文件URL作为参数传递给该方法。在方法的实现中,我们使用window.location.href来完成页面重定向,从而触发浏览器下载文件的操作。

以上是Vue和Django(DRF)实现文件上传下载功能的完整攻略。在实际开发中,还需要处理一些细节问题,例如文件大小限制、文件类型校验、安全性等问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue与django(drf)实现文件上传下载功能全过程 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • VUE学习之Element-ui文件上传实例详解

    下面是对题目所给文章的详细讲解。 文章概述 本文讲解了如何在Vue项目中使用Element-ui的文件上传组件,并提供了一个完整的示例。文章中介绍了如何安装Element-ui,以及如何使用它提供的el-upload组件实现文件上传。 Element-ui简介与安装说明 Element-ui是一套基于Vue.js 2.0的组件库,它提供了许多常用的UI组件,…

    Vue 2023年5月28日
    00
  • vue3 reactive函数用法实战教程

    下面是对“vue3 reactive函数用法实战教程”的详细讲解。 什么是vue3 reactive函数? reactive 是 Vue 3 中新引入的一个 API,用于创建响应式对象。通过 reactive 创建出来的对象,在其属性值发生改变时,会自动触发所依赖的组件进行更新。 reactive 函数怎么用? 使用 reactive 可以将一个普通的 Ja…

    Vue 2023年5月28日
    00
  • Vue中.vue文件比main.js先执行的问题及解决

    在Vue项目中,经常会遇到.vue文件比main.js先执行的问题,并且该问题可能会导致程序运行失败或运行结果异常。下面是解决该问题的完整攻略。 问题描述 在Vue项目的main.js文件中,我们通常使用Vue框架的实例化方法来启动整个应用程序。然而,在某些情况下,我们需要在main.js文件中引入.vue文件,并且在实例化Vue应用程序之前使用该文件中的组…

    Vue 2023年5月28日
    00
  • 使用vscode 开发uniapp的方法

    使用 VS Code 开发 uni-app 的步骤如下: 第一步:创建 uni-app 项目 使用命令行工具或者 HBuilderX 创建一个 uni-app 项目,如果你还没有创建过 uni-app 项目,可以参考 uni-app 官方文档 第二步:安装必要的插件 在 VS Code 中安装以下插件: Vue Vue 3 Snippets Vetur un…

    Vue 2023年5月27日
    00
  • vue.js watch经常失效的场景与解决方案

    Vue.js Watch经常失效的场景与解决方案 在使用Vue.js的过程中,watch是非常常用的一个功能,它可以监听数据的变化并实现相应的操作,但是在实际开发中使用watch时可能会出现失效的情况,本文将讲解Watch失效的场景及解决方案。 Watch 失效的场景 深度监听 在Vue.js中,许多组件和工具可以帮助我们在数据更改时实时更新视图。这是通过“…

    Vue 2023年5月29日
    00
  • 关于Node.js中的JXcore打包示例

    下面就来详细讲解“关于Node.js中的JXcore打包示例”的完整攻略。 Node.js中的JXcore打包示例 简介 JXcore是一种基于Node.js的开源项目,主要用于将Node.js项目转化为独立的应用程序,支持Node.js的所有模块和API。使用JXcore可以将原本需要使用Node.js命令行执行的代码打包成二进制文件,方便部署和使用。 安…

    Vue 2023年5月28日
    00
  • 使用vue3重构拼图游戏的实现示例

    首先我们来讲解一下使用Vue3重构拼图游戏的实现示例。 步骤1:创建Vue3项目和引入所需依赖 创建一个Vue3项目可以使用Vue-cli来完成,安装完毕后,我们需要引入所需依赖。首先是引入Vue3: import { createApp } from ‘vue’ 然后是引入Element UI: import ElementPlus from ‘eleme…

    Vue 2023年5月28日
    00
  • Vue3+Vite使用双token实现无感刷新

    下面我将详细讲解“Vue3+Vite使用双token实现无感刷新”的完整攻略。 什么是双token实现无感刷新? 双token是指前后端各自维护一个token,前端在请求后端接口时需要在请求头中携带两个token,一个是用户信息token,另一个是操作token,后端通过判断这两个token的有效性,来决定是否需要重新登录,从而达到无感知的更新token的目…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部