uni-app上传图片视频音频

在写上传的功能时候,发现uni.choosefile上传文件不支持app,所以就自己写了一个上传的方法。、

 首先写了一个上传文件的组件。、,用input写成的。

<view class="content" style="opacity: 0; position: absolute; bottom: 0;  0rem; height: 0rem;" >    
<view ref="input"  class="input">  </view>      
</view>

然后写他的事件:

mounted() {  
    var input = document.createElement('input')  
    input.type = 'file' ; 
    input.id="fileuplaod";
    input.onchange = (e) => {
    this._choose_file(input,e);
    }  
    this.$refs.input.$el.appendChild(input) 
    }  ,
    
methods: {
    _createfile(e){
    let domobj=document.getElementById("fileuplaod");
    domobj.click();            
    },
    _choose_file(a,b){
    this.$emit("afterchose",a.files);
    //console.log(a,b)
    }

    }

然后在页面上进行引用。

 <fileupload ref="fileupload" @afterchose="_afterchose" >
 </fileupload>  

对应的事件

_afterchose(e){
    let that=this;
        var file = document.querySelector('input[type=file]').files[0];
    this.uploadType=e[0].type;
    var reader = new FileReader();
     reader.onloadend = function () {
    console.log("展示的数据",file)}
     if (file) {
    reader.readAsDataURL(file);
}},

这个时候已经拿到了上传的文件地址。

接着就是把拿到的地址展示到页面上面,然后对不同的文件进行不同的组件名称。

<view class="content">
<fileupload ref="fileupload" @afterchose="_afterchose" ></fileupload> //上传的组件 
<view class="datalists"  v-for="(item,index) in datalist" :key="index">
<image v-if="item.type=='image/png'||item.type=='image/jpeg'"  class="image1" :src="item.srcs"> //当是图片的时候展示     
<video :poster="poster2" class="image1" :src="item.srcs" controlsv-if="item.type=='video/mp4'||item.type=='video/x-ms-wmv'"> //当是视频的时候显示 
</video>                                            
<audio :poster="poster1" v-if="item.type=='audio/mp3'" :src="item.srcs"  controls></audio> //当是音频的时候显示
</view>
<view class="uplode" @click="uploadfile()">+</view></view>  //上传点击事件

最后对事件和js处理

//上传的点击事件
uploadfile(){
this.$refs.fileupload._createfile(); },
data(){
return:{
datalist:[], //data建立一个空的数组
}

//展示图片事件
_afterchose(e){ let that
=this; var file = document.querySelector('input[type=file]').files[0]; //上传的文件地址路径 this.uploadType=e[0].type; //判断当前上传文件的类型 var reader = new FileReader(); reader.onloadend = function () { let fileParam = { size:e[0].size, //上传的文件大小 type:e[0].type, //上传的文件类型 srcs:reader.result }; that.datalist.push(fileParam) } if (file) { eader.readAsDataURL(file); } },

最后就写好了。css样式就不写了。

如果需要多文件上传,改两个地方就好啦,

组价的mounted:

mounted() {  
            var input = document.createElement('input')  
            input.type = 'file' ; 
            input.multiple="multiple";    //加上多文件上传的属性
            input.id="fileuplaod";
            input.onchange = (e) => {
                this._choose_file(input,e);
            }  
            this.$refs.input.$el.appendChild(input) 
        }  ,

然后对获取文件的事件,进行一个循环取值:

        _afterchose(e){
           let that=this;
           var file;    
           let filelist=document.querySelector('input[type=file]').files
           for(let i=0;i< filelist.length;i++){                               
           file = filelist[i];
           console.log("上传的文件",file)        
           this.uploadType=e[i].type;
           var reader = new FileReader();
           reader.onloadend = function (obj) {
           let fileParam = {
               name:file.name,
               size:file.size,
               type:file.type,
               srcs:obj.target.result
                            };
                that.datalist.push(fileParam)
                 console.log("现在的"+ JSON.stringify(that.datalist))
             }
               if (file) {                    
                    reader.readAsDataURL(file);
                           }
                 }
                                 
                      },

这样子就ok了

原文地址:https://www.cnblogs.com/lovebear123/p/14134474.html