vue上传文件详解

一、vue上传文件后展示

在介绍vue上传文件的方式之前,我们需要先了解如何在上传文件后展示上传的内容。我们可以借助JavaScript中的FileReader对象来实现。下面的代码片段展示了如何在上传文件后,将其内容展示在页面上:


<template>
  <div>
    <input type="file" @change="previewFile">
    <img :src="imageSrc" v-if="imageSrc">
  </div>
</template>

<script>
export default {
  data() {
    return {
      imageSrc: null
    }
  },
  methods: {
    previewFile(event) {
      const file = event.target.files[0];
      const reader = new FileReader();
      reader.readAsDataURL(file);
      reader.onload = () => {
        this.imageSrc = reader.result;
      };
    }
  }
}
</script>

上面的代码中,我们在模板中添加了一个文件上传框和一个图像标签。选取文件后,调用previewFile函数来处理文件,通过FileReader对象读取图片的URL,并将其绑定到imageSrc变量上,通过v-if指令在页面上展示图片。

二、vue上传文件503

上传文件时,有可能会遇到503错误,表示上传的文件过大或者类型不支持。这时,我们可以在前端代码中设置对应的文件大小和限制文件类型。下面的代码展示了如何在Vue中设置这些限制:


// 在template部分
<div>
  <input type="file" ref="fileInput" @change="handleFileUpload">
</div>

// 在script部分
export default {
  data() {
    return {
      validFileType: ['image/png', 'image/jpg', 'image/jpeg'],
      maxFileSize: 2 * 1024 * 1024 // 最大2MB
    }
  },
  methods: {
    handleFileUpload() {
      const file = this.$refs.fileInput.files[0];
      if (!this.validFileType.includes(file.type)) {
        alert('只能上传jpg/png/jpeg格式的文件!');
        return;
      }
      if (file.size > this.maxFileSize) {
        alert('上传文件大小超过限制!');
        return;
      }
      // 文件通过验证,进行上传操作
    }
  }
}

上面的代码中,我们首先在数据对象中定义了一个数组validFileType和一个数值maxFileSize,分别表示允许上传的文件类型和文件大小限制。handleFileUpload方法中,我们获取到上传的文件,根据文件类型和文件大小进行验证,如果验证通过,则执行上传操作。

三、vue上传文件到后端

在Vue中,我们可以使用axios库进行后端请求。下面的代码片段展示了如何使用axios库,将上传的文件发送到后端:


// 在template部分
<div>
  <input type="file" ref="fileInput" @change="handleFileUpload">
</div>

// 在script部分
import axios from 'axios';

export default {
  methods: {
    handleFileUpload() {
      const file = this.$refs.fileInput.files[0];
      const formData = new FormData();
      formData.append('file', file);
      axios.post('/api/file/upload', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      }).then(response => {
        console.log(response);
      }).catch(error => {
        console.log(error);
      });
    }
  }
}

上面的代码中,我们首先导入了axios库。在handleFileUpload方法中,我们先获取上传的文件,创建FormData对象,并将文件添加到其中。然后我们使用axios发起POST请求,将FormData对象作为请求体,同时设置Content-Type为multipart/form-data。上传成功后,控制台会打印出响应结果。

四、vue上传文件到服务器

除了上传到后端,我们也可以将文件上传到服务器存储。服务器端代码可以使用Node.js来实现。下面的代码片段展示了如何使用Node.js和Express框架,将上传的文件保存到服务器上:


const express = require('express');
const fileUpload = require('express-fileupload');
const app = express();

app.use(fileUpload());

app.post('/api/file/upload', (req, res) => {
  const file = req.files.file;
  const fileName = Date.now() + '-' + file.name;
  file.mv(__dirname + '/uploads/' + fileName, error => {
    if (error) {
      console.log(error);
      return res.status(500).send(error);
    }
    res.send('文件上传成功!');
  });
});

app.listen(3000, () => {
  console.log('服务器已启动,监听端口号为3000');
});

上面的代码中,我们首先使用npm安装了express和express-fileupload两个Node.js库。在代码中,我们使用fileUpload中间件来处理上传的文件,然后在/api/file/upload路径上设置了POST方法。在路由处理函数中,我们通过req.files获取到上传的文件,然后生成一个新的文件名,并使用mv方法将文件保存到服务器上。上传成功后,服务器会返回成功信息。

五、vue上传文件进度条

在上传大型文件时,我们可以添加进度条,以使用户了解上传进度。下面的代码片段展示了如何使用axios库和vue-progressbar库来实现上传进度条:


// 在template部分
<div>
  <input type="file" ref="fileInput" @change="handleFileUpload">
  <vue-progress-bar :width="uploadPercentage"></vue-progress-bar>
</div>

// 在script部分
import axios from 'axios';
import VueProgressBar from 'vue-progressbar';

export default {
  components: {
    VueProgressBar
  },
  data() {
    return {
      uploadPercentage: 0
    }
  },
  methods: {
    handleFileUpload() {
      this.uploadPercentage = 0;
      const file = this.$refs.fileInput.files[0];
      const formData = new FormData();
      formData.append('file', file);
      axios.post('/api/file/upload', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        },
        onUploadProgress: progressEvent => {
          this.uploadPercentage = parseInt(Math.round((progressEvent.loaded * 100) / progressEvent.total));
        }
      }).then(response => {
        console.log(response);
      }).catch(error => {
        console.log(error);
      });
    }
  }
}

上面的代码中,我们首先导入了VueProgressBar库,然后在模板中添加了一个进度条组件。在数据对象中,我们定义了一个变量uploadPercentage,表示上传进度百分比。在handleFileUpload方法中,我们在发送POST请求时,通过设置onUploadProgress回调函数来更新上传进度。上传结束后,进度条会自动消失。

六、vue上传文件组件

我们可以将文件上传封装成一个Vue组件,使代码更加模块化。下面的代码片段展示了如何实现文件上传组件:


// 在模板部分
<template>
  <div>
    <label :for="id">选择文件</label>
    <input type="file" :id="id" ref="fileInput" style="display: none" @change="handleFileUpload">
    <div v-if="uploadPercentage > 0">
      <vue-progress-bar :width="uploadPercentage"></vue-progress-bar>
    </div>
    <slot></slot>
  </div>
</template>

// 在script部分
import axios from 'axios';
import VueProgressBar from 'vue-progressbar';

export default {
  name: 'FileUpload',
  components: {
    VueProgressBar
  },
  props: {
    id: {
      type: String,
      required: true
    },
    url: {
      type: String,
      required: true
    }
  },
  data() {
    return {
      uploadPercentage: 0
    }
  },
  methods: {
    handleFileUpload() {
      this.uploadPercentage = 0;
      const file = this.$refs.fileInput.files[0];
      const formData = new FormData();
      formData.append('file', file);
      axios.post(this.url, formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        },
        onUploadProgress: progressEvent => {
          this.uploadPercentage = parseInt(Math.round((progressEvent.loaded * 100) / progressEvent.total));
        }
      }).then(response => {
        this.$emit('uploaded', response.data);
      }).catch(error => {
        console.log(error);
      });
    }
  }
}

上面的代码中,我们将文件上传封装成一个名为FileUpload的组件,在模板中添加了一个input元素,通过props属性传递id和url。在handleFileUpload方法中,我们使用axios库发送POST请求,并通过设置onUploadProgress回调函数来实时更新上传进度。上传完成后,组件通过$emit方法发送uploaded事件,并将响应结果作为参数传递给父组件。

七、vue上传文件夹

在Vue中,我们也可以上传整个文件夹,而不只是单个文件。下面的代码片段展示了如何使用HTML5的webkitdirectory属性来实现上传整个文件夹:


// 在模板部分
<template>
  <div>
    <input type="file" multiple webkitdirectory @change="handleFolderUpload">
  </div>
</template>

// 在script部分
import axios from 'axios';

export default {
  methods: {
    handleFolderUpload() {
      const files = Array.from(event.target.files);
      const formData = new FormData();
      files.forEach(file => {
        formData.append('files[]', file);
      });
      axios.post('/api/folder/upload', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      }).then(response => {
        console.log(response);
      }).catch(error => {
        console.log(error);
      });
    }
  }
}

上面的代码中,我们在input元素中添加了multiple和webkitdirectory属性,这样可以支持上传多个文件和整个文件夹。在handleFolderUpload方法中,我们首先通过Array.from方法将文件列表转换为数组,然后使用FormData对象将所有文件添加到其中。通过axios库发送POST请求,将FormData对象作为请求体,上传整个文件夹。

八、vue上传文件打印jason

在Vue中,我们也可以上传一个JSON格式的文件,并在上传成功后打印JSON内容。下面的代码片段展示了如何实现这个功能:


// 在模板部分
<template>
  <div>
    <input type="file" ref="fileInput" @change="handleJsonUpload">
  </div>
</template>

// 在script部分
export default {
  methods: {
    handleJsonUpload() {
      const file = this.$refs.fileInput.files[0];
      const reader = new FileReader();
      reader.readAsText(file);
      reader.onload = event => {
        const json = JSON.parse(event.target.result);
        console.log(json);
      };
    }
  }
}

上面的代码中,我们首先获取上传的文件,然后使用FileReader对象读取文件内容。通过设置onload回调函数,我们将读取到的文件内容转换为JSON对象,并打印到控制台中。

九、Vue上传文件跨域

在开发过程中,为了保证前端代码和后端代码可以分别部署在不同的服务器上,我们需要进行跨域配置。下面的代码片段展示了如何在Vue中配置跨域:


// 在项目的config目录中创建index.js文件
module.exports = {
dev: {
proxyTable: {
'/api': { // 需要跨域的请求路径
target: 'http://localhost:8080', // 目标服务器地址
changeOrigin: true, // 改变referer
pathRewrite: {
'^/api': '/api' // 替换请求路径
}
}
}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/304625.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2025-01-01 11:05
下一篇 2025-01-01 11:05

相关推荐

  • 使用Vue实现前端AES加密并输出为十六进制的方法

    在前端开发中,数据传输的安全性问题十分重要,其中一种保护数据安全的方式是加密。本文将会介绍如何使用Vue框架实现前端AES加密并将加密结果输出为十六进制。 一、AES加密介绍 AE…

    编程 2025-04-29
  • Vue TS工程结构用法介绍

    在本篇文章中,我们将从多个方面对Vue TS工程结构进行详细的阐述,涵盖文件结构、路由配置、组件间通讯、状态管理等内容,并给出对应的代码示例。 一、文件结构 一个好的文件结构可以极…

    编程 2025-04-29
  • Vue3的vue-resource使用教程

    本文将从以下几个方面详细阐述Vue3如何使用vue-resource。 一、安装Vue3和vue-resource 在使用vue-resource前,我们需要先安装Vue3和vue…

    编程 2025-04-27
  • ThinkPHP6 + Vue.js: 不使用Fetch的数据请求方法

    本文将介绍如何在ThinkPHP6和Vue.js中进行数据请求,同时避免使用Fetch函数。 一、AJAX:XMLHttpRequest的基础使用 在进行数据请求时,最基础的方式就…

    编程 2025-04-27
  • Vue模拟按键按下

    本文将从以下几个方面对Vue模拟按键按下进行详细阐述: 一、Vue 模拟按键按下的场景 在前端开发中,我们常常需要模拟按键按下的场景,比如在表单中填写内容后,按下“回车键”提交表单…

    编程 2025-04-27
  • 开发前端程序,Vue是否足够?

    Vue是一个轻量级,高效,渐进式的JavaScript框架,用于构建Web界面。开发人员可以使用Vue轻松完成前端编程,开发响应式应用程序。然而,当涉及到需要更大的生态系统,或利用…

    编程 2025-04-27
  • 如何在Vue中点击清除SetInterval

    在Vue中点击清除SetInterval是常见的需求之一。本文将介绍如何在Vue中进行这个操作。 一、使用setInterval和clearInterval 在Vue中,使用set…

    编程 2025-04-27
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25

发表回复

登录后才能评论