[js进阶]axios+FormData文件上传

[js进阶]axios+FormData文件上传

原理:FormData上传

创建一个FormData对象,将得到的文件流对象放在FormData内,然后使用axios上传

请求头设置

Content-Type(内容类型),一般是指网页中存在的 Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些 PHP 网页点击的结果却是下载一个文件或一张图片的原因。

Content-Type 标头告诉客户端实际返回的内容的内容类型。

语法格式:

Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something

以application开头的媒体格式类型:

  • application/xhtml+xml :XHTML格式
  • application/xml: XML数据格式
  • application/atom+xml :Atom XML聚合格式
  • application/json: JSON数据格式
  • application/pdf:pdf格式
  • application/msword : Word文档格式
  • application/octet-stream : 二进制流数据(如常见的文件下载)
  • application/x-www-form-urlencoded : <form encType="">中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

另外一种常见的媒体格式是上传文件之时使用的:

  • multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
headers: { 'Content-Type': 'multipart/form-data' }

请求上传文件方法

export function submitTask(parameter) {
  return request({
    url: 'xxx',
    method: 'post',
    data: parameter,
    headers: {
      'Content-Type': 'multipart/form-data'
    }
  })
}

上传函数中操作FormData对象

无论是用input type=“file”还是一些框架的上传组件,都可以的到一个file文件流,示例使用的是antd的Upload组件。

<a-upload-dragger
  :fileList='fileList'
  accept='.zip'
  :beforeUpload='beforeUpload'
  :remove='handleRemove'
>
export default {
    data() {
        return {
            fileList: [],
            uploading: false,
        };
    },

    methods: {
        handleRemove(file) {
            const index = this.fileList.indexOf(file);
            const newFileList = this.fileList.slice();
            newFileList.splice(index, 1);
            this.fileList = newFileList;
        },
        beforeUpload(file) {
            this.fileList = [...this.fileList, file];
            return false;
        },
        handleUpload() {
            const { fileList } = this;
            const formData = new FormData();
            fileList.forEach(file => {
                formData.append('files[]', file);
            });
            this.uploading = true;

            // You can use any AJAX library you like
            reqwest({
                url: 'https://www.mocky.io/v2/5cc8019d300000980a055e76',
                method: 'post',
                processData: false,
                data: formData,
                success: () => {
                    this.fileList = [];
                    this.uploading = false;
                    this.$message.success('upload successfully.');
                },
                error: () => {
                    this.uploading = false;
                    this.$message.error('upload failed.');
                },
            });
        },
    } 
}

最后上传的结果

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
axios中获取文件度需要使用axios的onUploadProgress方法。在Vue3中,可以使用Composition API来实现。以下是一个使用axios + vue3 + vite获取文件度的示例代码: 引用中的request.ts文件中的代码: ```typescript import axios, { AxiosRequestConfig } from 'axios' const request = axios.create({ baseURL: 'http://localhost:1101', timeout: 5000 }) // 请求拦截器 request.interceptors.request.use(function (config) { // 一般在这里设置token // console.log('config', config) return config }, function (err) { return Promise.reject(err) }) // 响应拦截器 request.interceptors.response.use(function (config) { return config }, function (err) { return Promise.reject(err) }) // 返回数据data export default <T = any>(config: AxiosRequestConfig) => { return request(config).then(res => { return res.data.data as T // 根据你自己的情况 }) } ``` 在Vue3组件中,可以使用Composition API来实现文件度的获取。以下是一个示例代码: ```vue <template> <div> <input type="file" @change="uploadFile" /> <div v-if="progress !== null"> {{ progress }}% </div> </div> </template> <script> import { ref } from 'vue' import uploadFileApi from '@/api/uploadFile' export default { setup() { const progress = ref<number | null>(null) const uploadFile = async (event: Event) => { const file = (event.target as HTMLInputElement).files?.[0] if (!file) { return } const formData = new FormData() formData.append('file', file) await uploadFileApi({ url: '/upload', method: 'post', data: formData, onUploadProgress: (progressEvent) => { progress.value = Math.round((progressEvent.loaded / progressEvent.total) * 100) } }) progress.value = null } return { progress, uploadFile } } } </script> ``` 在上面的代码中,我们使用了ref来定义一个响应式的progress变量,用于显示上度。在uploadFile方法中,我们使用FormData来创建一个包含文件的表单数据,并将其作为data参数递给uploadFileApi方法。在uploadFileApi方法中,我们使用onUploadProgress方法来获取上度,并将其赋值给progress变量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值