海边一草 發表於 2020-12-14 17:36:00

uni-app上传图片视频音频

<p>在写上传的功能时候,发现uni.choosefile上传文件不支持app,所以就自己写了一个上传的方法。、</p>
<p><img src="https://img2020.cnblogs.com/blog/1728151/202012/1728151-20201214171338994-85015110.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;首先写了一个上传文件的组件。、,用input写成的。</p>
<div class="cnblogs_code">
<pre>&lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">content</span><span style="color: rgba(128, 0, 0, 1)">"</span> style=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">opacity: 0; position: absolute; bottom: 0; width: 0rem; height: 0rem;</span><span style="color: rgba(128, 0, 0, 1)">"</span> &gt;   
&lt;view <span style="color: rgba(0, 0, 255, 1)">ref</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">input</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">input</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;&lt;/view&gt;      
&lt;/view&gt;</pre>
</div>
<p>然后写他的事件:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mounted() {
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> input = document.createElement(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">input</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
    input.type </span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">file</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> ;
    input.id</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fileuplaod</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
    input.onchange </span>= (e) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">._choose_file(input,e);
    }
    </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.$refs.input.$el.appendChild(input)
    },
   
methods: {
    _createfile(e){
    let domobj</span>=document.getElementById(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fileuplaod</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    domobj.click();            
    },
    _choose_file(a,b){
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.$emit(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">afterchose</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,a.files);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">console.log(a,b)</span>
<span style="color: rgba(0, 0, 0, 1)">    }

    }</span></pre>
</div>
<p>然后在页面上进行引用。</p>
<div class="cnblogs_code">
<pre> &lt;fileupload <span style="color: rgba(0, 0, 255, 1)">ref</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fileupload</span><span style="color: rgba(128, 0, 0, 1)">"</span> @afterchose=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">_afterchose</span><span style="color: rgba(128, 0, 0, 1)">"</span> &gt;
&lt;/fileupload&gt;</pre>
</div>
<p>对应的事件</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">_afterchose(e){
    let that</span>=<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">var</span> file = document.querySelector(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">input</span><span style="color: rgba(128, 0, 0, 1)">'</span>).files[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">];
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.uploadType=e[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">].type;
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> reader = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> FileReader();
   reader.onloadend </span>=<span style="color: rgba(0, 0, 0, 1)"> function () {
    console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">展示的数据</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,file)}
   </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (file) {
    reader.readAsDataURL(file);
}},</span></pre>
</div>
<p>这个时候已经拿到了上传的文件地址。</p>
<p>接着就是把拿到的地址展示到页面上面,然后对不同的文件进行不同的组件名称。</p>
<div class="cnblogs_code">
<pre>&lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">content</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
&lt;fileupload <span style="color: rgba(0, 0, 255, 1)">ref</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fileupload</span><span style="color: rgba(128, 0, 0, 1)">"</span> @afterchose=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">_afterchose</span><span style="color: rgba(128, 0, 0, 1)">"</span> &gt;&lt;/fileupload&gt; //上传的组件
&lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">datalists</span><span style="color: rgba(128, 0, 0, 1)">"</span>v-<span style="color: rgba(0, 0, 255, 1)">for</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">(item,index) in datalist</span><span style="color: rgba(128, 0, 0, 1)">"</span> :key=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">index</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
&lt;image v-<span style="color: rgba(0, 0, 255, 1)">if</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">item.type=='image/png'</span>||item.type==<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">image/jpeg</span><span style="color: rgba(128, 0, 0, 1)">'"</span><span style="color: rgba(128, 0, 0, 1)">class=</span><span style="color: rgba(128, 0, 0, 1)">"</span>image1<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)"> :src=</span><span style="color: rgba(128, 0, 0, 1)">"</span>item.srcs<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">&gt; //当是图片的时候展示   </span>
&lt;video :poster=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">poster2</span><span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">image1</span><span style="color: rgba(128, 0, 0, 1)">"</span> :src=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">item.srcs</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> controlsv</span>-<span style="color: rgba(0, 0, 255, 1)">if</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">item.type=='video/mp4'</span>||item.type==<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">video/x-ms-wmv</span><span style="color: rgba(128, 0, 0, 1)">'"</span><span style="color: rgba(128, 0, 0, 1)">&gt; //当是视频的时候显示 </span>
&lt;/video&gt;                                          
&lt;audio :poster=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">poster1</span><span style="color: rgba(128, 0, 0, 1)">"</span> v-<span style="color: rgba(0, 0, 255, 1)">if</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">item.type=='audio/mp3'</span><span style="color: rgba(128, 0, 0, 1)">"</span> :src=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">item.srcs</span><span style="color: rgba(128, 0, 0, 1)">"</span>controls&gt;&lt;/audio&gt; //当是音频的时候显示
&lt;/view&gt;
&lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">uplode</span><span style="color: rgba(128, 0, 0, 1)">"</span> @click=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">uploadfile()</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;+&lt;/view&gt;&lt;/view&gt;//上传点击事件</pre>
</div>
<p>最后对事件和js处理</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">//上传的点击事件<br>uploadfile(){
</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.$refs.fileupload._createfile();
},</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">data(){<br>return:{<br>datalist:[],//data建立一个空的数组<br>}<br><br>//展示图片事件<br> _afterchose(e){
       let that</span>=<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">var</span> file = document.querySelector(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">input</span><span style="color: rgba(128, 0, 0, 1)">'</span>).files[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">]; //上传的文件地址路径
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.uploadType=e[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">].type;//判断当前上传文件的类型</span>
      <span style="color: rgba(0, 0, 255, 1)">var</span> reader = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> FileReader();
      reader.onloadend </span>=<span style="color: rgba(0, 0, 0, 1)"> function () {
      let fileParam </span>=<span style="color: rgba(0, 0, 0, 1)"> {
      size:e[</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">].size, //上传的文件大小
      type:e[</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">].type,//上传的文件类型
      srcs:reader.result
   };
      that.datalist.push(fileParam)
      }
       </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (file) {
      eader.readAsDataURL(file);
                }
                },</span></pre>
</div>
<p>&nbsp;</p>
<p>最后就写好了。css样式就不写了。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>如果需要多文件上传,改两个地方就好啦,</p>
<p>组价的mounted:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mounted() {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> input = document.createElement(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">input</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
            input.type </span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">file</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> ;
            input.multiple</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">multiple</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;    //加上多文件上传的属性
            input.id</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fileuplaod</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            input.onchange </span>= (e) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">._choose_file(input,e);
            }
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.$refs.input.$el.appendChild(input)
      },</span></pre>
</div>
<p>然后对获取文件的事件,进行一个循环取值:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">      _afterchose(e){
         let that</span>=<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">;
         </span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> file;   
         let filelist</span>=document.querySelector(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">input</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">).files
         </span><span style="color: rgba(0, 0, 255, 1)">for</span>(let i=<span style="color: rgba(128, 0, 128, 1)">0</span>;i&lt; filelist.length;i++<span style="color: rgba(0, 0, 0, 1)">){                              
         file </span>=<span style="color: rgba(0, 0, 0, 1)"> filelist;
         console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">上传的文件</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,file)      
         </span><span style="color: rgba(0, 0, 255, 1)">this</span>.uploadType=<span style="color: rgba(0, 0, 0, 1)">e.type;
         </span><span style="color: rgba(0, 0, 255, 1)">var</span> reader = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> FileReader();
         reader.onloadend </span>=<span style="color: rgba(0, 0, 0, 1)"> function (obj) {</span><span style="color: rgba(0, 0, 0, 1)">
         let fileParam </span>=<span style="color: rgba(0, 0, 0, 1)"> {
               name:file.name,
               size:file.size,
               type:file.type,
               srcs:obj.target.result
                            };
                that.datalist.push(fileParam)
               console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">现在的</span><span style="color: rgba(128, 0, 0, 1)">"</span>+<span style="color: rgba(0, 0, 0, 1)"> JSON.stringify(that.datalist))
             }
               </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (file) {                  
                  reader.readAsDataURL(file);
                           }
               }
                                 
                      },</span></pre>
</div>
<p>这样子就ok了</p><br><br>
来源:https://www.cnblogs.com/lovebear123/p/14134474.html
頁: [1]
查看完整版本: uni-app上传图片视频音频