前端使用axios上传文件

这篇具有很好参考价值的文章主要介绍了前端使用axios上传文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

不用脚手架,引入vue,上传文件实现代码?
要在不使用脚手架的情况下,引入 Vue 并实现上传文件的功能,可以按照以下步骤进行:

  1. 在 HTML 文件中引入 Vue 和 Axios 库:
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  1. 在 HTML 文件中定义 Vue 实例,并编写上传文件相关的代码:
<div id="app">
  <input type="file" @change="handleUpload" ref="fileInput">
</div>

<script>
new Vue({
  el: '#app',
  methods: {
    handleUpload() {
      const formData = new FormData();
      const file = this.$refs.fileInput.files[0];
      formData.append('file', file);
      axios.post('/upload', formData)
        .then(response => {
          console.log('上传成功');
        })
        .catch(error => {
          console.error('上传失败:', error);
        });
    }
  }
});
</script>

在上述示例中,我们首先在 HTML 文件中定义了一个包含一个文件上传 input 元素的 Vue 实例,在其中编写了一个 handleUpload 方法用于处理上传文件事件。

当用户选择文件后,我们通过 FormData 对象创建了一个新的表单数据对象,并将选择的文件添加到其中。然后,使用 axios.post 方法向服务器发送一个 POST 请求,请求的 URL 是 /upload,此处需要根据实际情况进行修改。

当上传成功时,.then 方法会被执行,并在控制台打印 ‘上传成功’;当上传失败时,.catch 方法会被执行,并在控制台打印错误信息。

需要注意的是,在以上例子中,我们使用 ref 属性获取了 file input 元素的引用,并通过 this.$refs.fileInput.files[0] 获取了用户选择的文件。

多个不同文件呢?
可以修改 handleUpload 方法,用一个数组来保存用户选择的多个文件,并将每个文件都添加到 FormData 对象中,然后一次性向服务器发送所有文件。以下是一个示例:

<div id="app">
  <input type="file" @change="handleUpload" ref="fileInput" multiple>
</div>

<script>
new Vue({
  el: '#app',
  methods: {
    handleUpload() {
      const formData = new FormData();
      const files = this.$refs.fileInput.files;
      for (let i = 0; i < files.length; i++) {
        formData.append('files[]', files[i]);
      }
      axios.post('/upload', formData)
        .then(response => {
          console.log('上传成功');
        })
        .catch(error => {
          console.error('上传失败:', error);
        });
    }
  }
});
</script>

在上述示例中,我们首先为 file input 元素设置了 multiple 属性,使得用户可以选择多个文件。然后,在 handleUpload 方法中,我们定义了一个空 FormData 对象和一个用于保存文件的空数组。

通过遍历选择的文件列表,并依次将每个文件添加到 FormData 对象中,并指定表单参数名为 ‘files[]’。这里需要注意的是,表单参数名需要以数组形式传递,即多个文件都会被作为同一个参数名的数组元素进行传递。

最后,我们使用 axios.post 方法向服务器发送一个 POST 请求,请求的 URL 是 /upload,并把包含所有文件的 FormData 对象作为参数进行提交。

我还想把其中的图片预览
要预览上传的图片,可以在用户选择文件时,将图片的 Base64 编码存储到 Vue 实例中,并使用 URL.createObjectURL 生成一个预览链接保存在另一个数组中,最后在页面上渲染这些预览链接。以下是一个示例:

<div id="app">
  <input type="file" @change="handleUpload" ref="fileInput" multiple>
  <div v-for="(url, index) in previewUrls" :key="index">
    <img :src="url" width="200">
  </div>
</div>

<script>
new Vue({
  el: '#app',
  data() {
    return {
      files: [],
      previewUrls: []
    };
  },
  methods: {
    handleUpload() {
      const formData = new FormData();
      const files = this.$refs.fileInput.files;
      for (let i = 0; i < files.length; i++) {
        formData.append('files[]', files[i]);
        if (/^image\//.test(files[i].type)) {
          const reader = new FileReader();
          reader.readAsDataURL(files[i]);
          reader.onload = () => {
            this.previewUrls.push(reader.result);
          };
        }
      }
      axios.post('/upload', formData)
        .then(response => {
          console.log('上传成功');
        })
        .catch(error => {
          console.error('上传失败:', error);
        });
    }
  }
});
</script>

在上述示例中,我们首先定义了一个名称为 previewUrls 的数组,用于保存所有文件的预览链接。当用户选择文件时,我们遍历每个文件,并把它们添加到 FormData 对象中。如果当前文件是一张图片,我们使用 FileReader 对象读取并解析它的 Base64 编码,并把解析结果添加到 previewUrls 数组中。

需要注意的是,在使用 FileReader 对象时,必须在 readAsDataURL 方法之后,通过 onload 回调函数处理读取完成后返回的内容。

最后,当文件列表和预览列表都准备好了,我们可以使用 Vue 的 v-for 指令,在页面上渲染所有的预览链接,并以相应文件的index作为其key值进行区分展示,图片预览相关内容在 v-for 循环内展示出来以实现动态渲染。

设置图片不变形,超出部分隐藏
要设置图片不变形、超出部分隐藏,可以使用 CSS 的 object-fitobject-position 属性。object-fit 属性用于指定当图片尺寸与容器尺寸不同时如何调整图片大小,而 object-position 属性则用于指定图片在容器中显示的位置。

以下是一个示例:

<div id="app">
  <input type="file" @change="handleUpload" ref="fileInput" multiple>
  <div v-for="(url, index) in previewUrls" :key="index" class="preview-container">
    <img :src="url" class="preview-image">
  </div>
</div>

<style>
.preview-container {
  width: 200px;
  height: 200px;
  overflow: hidden;
}

.preview-image {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center center;
}
</style>

<script>
new Vue({
  el: '#app',
  data() {
    return {
      files: [],
      previewUrls: []
    };
  },
  methods: {
    handleUpload() {
      const formData = new FormData();
      const files = this.$refs.fileInput.files;
      for (let i = 0; i < files.length; i++) {
        formData.append('files[]', files[i]);
        if (/^image\//.test(files[i].type)) {
          const reader = new FileReader();
          reader.readAsDataURL(files[i]);
          reader.onload = () => {
            this.previewUrls.push(reader.result);
          };
        }
      }
      axios.post('/upload', formData)
        .then(response => {
          console.log('上传成功');
        })
        .catch(error => {
          console.error('上传失败:', error);
        });
    }
  }
});
</script>

在上述示例中,我们为每个预览容器设置了一个宽度和高度,并通过 overflow: hidden 属性隐藏超出容器范围的部分。而为了让图片填满容器并保持比例不变,我们为图片设置了 width: 100%height: 100% 属性,并使用 object-fit: cover 属性指定将图片等比例缩放以完全覆盖容器。

同时,为了让图片可见区域居中显示,我们还可以使用 object-position: center center 属性来指定其水平和垂直方向上的位置。

上传的同时带上参数,怎么实现?
要在文件上传时同时带上参数,可以使用 FormData 对象的 append() 方法向表单中添加额外的数据。

以下是一个示例:

<div id="app">
  <input type="file" @change="handleUpload" ref="fileInput" multiple>
</div>

<script>
new Vue({
  el: '#app',
  methods: {
    handleUpload() {
      const formData = new FormData();
      const files = this.$refs.fileInput.files;
      
      // 向 FormData 中添加 param1 和 param2 参数
      formData.append('param1', 'value1');
      formData.append('param2', 'value2');

      for (let i = 0; i < files.length; i++) {
        formData.append('files[]', files[i]);
      }
      axios.post('/upload', formData)
        .then(response => {
          console.log('上传成功');
        })
        .catch(error => {
          console.error('上传失败:', error);
        });
    }
  }
});
</script>

在上述示例中,我们使用 formData.append()param1param2 参数添加到表单中,并设置它们的值。在上传文件时,我们把包含所有文件和额外参数的 FormData 对象作为 POST 请求的数据,然后将其提交到服务器上。
要在上传文件时设置允许的文件格式,你可以通过在 input 标签中添加 accept 属性来限制用户输入的文件类型。这个属性的值可以是逗号分隔的 MIME 类型或者文件后缀名,多个类型之间用“|”符号隔开。

以下是一个示例:

<div id="app">
  <input type="file" @change="handleUpload" ref="fileInput" multiple accept=".png,.jpg,.jpeg">
</div>

<script>
new Vue({
  el: '#app',
  methods: {
    handleUpload() {
      const formData = new FormData();
      const files = this.$refs.fileInput.files;
      for (let i = 0; i < files.length; i++) {
        formData.append('files[]', files[i]);
      }
      axios.post('/upload', formData)
        .then(response => {
          console.log('上传成功');
        })
        .catch(error => {
          console.error('上传失败:', error);
        });
    }
  }
});
</script>

在上述示例中,我们为 <input> 元素添加了 accept 属性,并将其值设为 “.png,.jpg,.jpeg”,以限制用户只能上传这三种类型的图片文件。如果用户选择了不符合规定的文件,则在上传时会出现错误提示。文章来源地址https://www.toymoban.com/news/detail-756340.html

到了这里,关于前端使用axios上传文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue+ElementUI+Axios实现携带参数的文件上传(数据校验+进度条)

    可以实现对上传文件的类型,大小进行数据校验,以及对上传文件所要携带的数据也进行的校验,也有文件上传进度的进度条。 一、Vue 结构部分 弹窗显示(文件上传框+文本框+单选按钮) 二、JS部分 1、数据和数据校验部分 2、方法部分 三、后端代码(Springboot) 1、接口层方

    2024年01月17日
    浏览(34)
  • antdesign+vue+ts自定义上传文件customRequest,显示进度条onProgress,axios请求中断axios.CancelToken。

    customRequest里面有一个data参数,data包含了对file文件上传状态的操作:例如:onSuccess、onProgress、onError等 和file文件。 改变文件上传状态:可以通过改变fileList里面file的status和respones。 踩坑: 1、在customRequest文件上传完成以后,会自动重新更新一下fileList文件。上传之前挂载在

    2023年04月25日
    浏览(27)
  • 使用Vue + axios实现图片上传,轻松又简单

    目录 一、Vue框架介绍 二、Axios 介绍 三、实现图片上传 四、Java接收前端图片 Vue是一款流行的用于构建用户界面的开源JavaScript框架。它被设计用于简化Web应用程序的开发,特别是单页面应用程序。 Vue具有轻量级、灵活和易学的特点,使得开发者能够快速构建交互式的前端界

    2024年02月09日
    浏览(37)
  • 使用Vue + FormData + axios实现图片上传功能实战

    前言 上节回顾 上一小节中,我们添加了 Vue-router 的路有数据,这些数据都将是后续实战课程中的真实路由数据了。同时引入了 ElementUI 的 el-menu 做为左侧菜单的组件,但本专栏的特点就是遇到第三方功能和组件,自己尽量也要实现一遍,所以,在文章末尾又自己实现了一个

    2024年02月09日
    浏览(30)
  • vue3 + element-plus 的 upload + axios + django 文件上传并保存

    座右铭: 怎么简单怎么来,以实现功能为主。 欢迎大家关注公众号与我交流  之前在网上搜了好多教程,一直没有找到合适自己的,要么只有前端部分没有后端,要么就是写的不是很明白。所以还得靠自己摸索出来后,来此记录一下整个过程。 其实就是不要用默认的 actio

    2024年02月20日
    浏览(30)
  • 使用Axios中的onUploadProgress实现显示文件上传进度

    onUploadProgress 是 Axios 这个 JavaScript 库中用于处理 HTTP 请求的一个配置选项之一。Axios 是一个基于 Promise 的 HTTP 客户端,用于在浏览器和 Node.js 中进行 HTTP 请求。 onUploadProgress 允许指定一个回调函数,在上传进度发生变化时被调用。这个回调函数接收一个进度事件对象作为参数

    2024年02月10日
    浏览(31)
  • 【前端学习记录】vue中使用el-upload组件时,上传文件进度条没有实时更新

    问题背景 今天在项目中遇到一个问题,使用el-upload组件时,上传文件进度条没有实时更新,需要手动点击一下才会更新。 原理及可尝试方案 el-upload 组件默认的进度条是通过 Ajax 请求上传文件,并且进度条通过监听 xhr.upload 的 progress 事件来实时更新。但是,有些浏览器在处

    2024年02月01日
    浏览(40)
  • 13 使用Vue + FormData + axios实现图片上传功能实战

    前言 上节回顾 上一小节中,我们添加了 Vue-router 的路有数据,这些数据都将是后续实战课程中的真实路由数据了。同时引入了 ElementUI 的 el-menu 做为左侧菜单的组件,但本专栏的特点就是遇到第三方功能和组件,自己尽量也要实现一遍,所以,在文章末尾又自己实现了一个

    2024年02月16日
    浏览(28)
  • 【JS】前端分片上传大文件(支持1G以上的超大文件)

           如果将大文件一次性上传, 耗时会非常长,甚至可能传输失败 ,那么我们怎么解决这个问题呢?既然大文件上传不适合一次性上传,那么我们可以尝试将文件分片散上传。 这样的技术就叫做分片上传。分片上传就是将大文件分成一个个小文件(切片),将切片进行

    2024年04月11日
    浏览(41)
  • 如何使用Vue实现Excel表格数据的导入,在前端实现Excel表格文件的上传和解析,并使用Table组件将解析出来的数据展示在前端页面上

    随着互联网的发展和社会的进步,各个行业的数据量越来越大,对于数据的处理变得越来越重要。其中,Excel表格是一种重要的数据处理工具。在前后端项目中,实现Excel表格的导入和导出功能也愈加常见。这篇文章将介绍如何使用Vue实现Excel表格数据的导入。 在开始介绍实现

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包