关于批量上传音乐文件的解决方案(Vue项目)

需求

项目是vue项目,要求添加多个音乐文件,然后一次传递到后端

刚开始的想法是用一个数组(MusicList)包裹多个音乐对象传递到后端

[
    ...
	{
        album: File,
        music: File,
        lrc: File,
        name: string,
        artist: string,
        account: string,
        type: 0 或者 1
    }
    {
        album: File,
        music: File,
        lrc: File,
        ...
    }
    ...
]

目前通过input标签已经将多个音乐文件存放在uploadMusicList数组中

但是这个音乐对象中包含了文件,所以需要先遍历uploadMusicList,再使用FormData类,将每个对象中的所有数据添加到FormData中

let MusicList =[]
this.uploadMusicList.forEach(ele => {
	let formData = new FormData()
    formData.append("album", ele.album)
	formData.append("music", ele.music)
    ....
    
    ary.push(formData)
}

// axios
this.$http.post(
        `/music/file/uploadMusic/batch`,
        MusicList
      ).then(res => {
        console.log(res)
	})

所以现在发送请求的参数变成了一个数组包含多个FormData对象

[FormData, FormData, ...]

到现在看似一切都没毛病,但是后端那边完全收不到数据

查看控制台发现,FormData对象放在数组中,FormData中是没有内容的,后端当然也就接受不到

最后改了一下传递的参数的方式,如下

结论

// 传递的形式如下
// 除了上传的人的账号 其他均以数组形式传递 整一个是一个FormData对象
//{
//    albumList: [],
//    musicList: [],
//    lrcList: [],
//    nameList: [],
//    artistList: [],
//    typeList: []
//    account: string,
//}
    
// 具体实现
let formData = new FormData()

// uploadMusicList中存放了多个音乐对象
this.uploadMusicList.forEach(ele => {
  	formData.append("musicList", ele.music)
    formData.append("sizeList", ele.size)
    formData.append("albumList", ele.album)
    formData.append("lrcList", ele.lrc)
    formData.append("typeList", ele.musicType)
    formData.append("nameList", ele.name)  
})
formData.append("account", window.sessionStorage.getItem('account'))

// axios
this.$http.post(
        `/music/file/uploadMusic/batch`,
        formData
      ).then(res => {
        console.log(res)
	})
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue项目上传文件切片可以使用第三方库vue-upload-component来实现。该库支持文件切片上传、进度条显示、取消上传等功能。 首先,安装vue-upload-component: ``` npm install vue-upload-component --save ``` 然后,在需要上传文件的组件中引入vue-upload-component: ```javascript <template> <div> <vue-upload-component ref="upload" :url="uploadUrl" :headers="headers" :data="uploadData" :multiple="false" :accept="'*'" :extensions="[]" :max-size="0" :with-credentials="false" :input-id="'file'" :drop="true" :drop-directory="false" :drop-chunk-size="0" :drop-chunk-threads="1" :drop-delay="0" :drop-timeout="0" :chunk-size="5 * 1024 * 1024" :chunk-retries="3" :chunk-simultaneous-uploads="3" @input-filter="inputFilter" @input-file="inputFile" @input-clear="inputClear" @before-upload="beforeUpload" @start="startUpload" @progress="progressUpload" @success="successUpload" @error="errorUpload" @abort="abortUpload"> </vue-upload-component> </div> </template> <script> import VueUploadComponent from 'vue-upload-component' export default { components: { VueUploadComponent }, data () { return { uploadUrl: 'your_upload_url', headers: { 'Authorization': 'Bearer ' + localStorage.getItem('token') }, uploadData: { 'foo': 'bar' } } }, methods: { inputFilter (newFile, oldFile, prevent) { // 文件过滤 }, inputFile (file) { // 文件选择 }, inputClear () { // 清空文件选择 }, beforeUpload (file) { // 文件上传前的处理 }, startUpload () { // 开始上传 }, progressUpload (progress) { // 上传进度 }, successUpload (response) { // 上传成功 }, errorUpload (error) { // 上传失败 }, abortUpload () { // 取消上传 } } } </script> ``` 其中,`chunk-size`表示切片大小,`chunk-retries`表示切片上传失败后的重试次数,`chunk-simultaneous-uploads`表示同时上传的切片数量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值