当前位置:   article > 正文

uniapp上传手机相册图片、视频或拍摄图片、视频上传_u-upload 上传视频不能播放

u-upload 上传视频不能播放

一开始想用现成组件uView的u-upload来实现,做到一半发现使用这个组件上传图片没有问题,可以满足从相册上传、直接拍摄、预览功能。但是,视频好像不支持预览,不知道是我写法不对还是怎么回事/(ㄒoㄒ)/~~

最终图片使用的u-upload组件,视频用了uniapp API 的 uni.chooseVideo()方法

一、上传或拍摄图片

  1. <!-- 图片 -->
  2. <view class="up-img">
  3. <view class="up-label">图片:</view>
  4. <u-upload :fileList="imgList" @afterRead="imgRead" @delete="deletePic" name="1" multiple :previewFullImage="true">
  5. </u-upload>
  6. </view>
  1. // 新增图片
  2. async imgRead(event) {
  3. // 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
  4. let lists = [].concat(event.file);
  5. let fileListLen = this.imgList.length;
  6. lists.map((item) => {
  7. this.imgList.push({
  8. ...item,
  9. status: 'uploading',
  10. message: '上传中'
  11. })
  12. });
  13. for (let i = 0; i < lists.length; i++) {
  14. const result = await this.uploadImg(lists[i], i);
  15. let item = this.imgList[fileListLen];
  16. this.imgList.splice(fileListLen, 1, Object.assign(item, {
  17. status: 'success',
  18. message: '',
  19. accessoryUrl: result
  20. }));
  21. fileListLen++;
  22. }
  23. },
  24. // 上传图片
  25. uploadImg(item, index) {
  26. return new Promise((resolve, reject) => {
  27. uni.uploadFile({
  28. url: baseUrl + `/md/quality/upload`, //需要传图片的后台接口
  29. filePath: item.url, // 上传图片 通过uni-app的uni-file-picker组件 函数返回
  30. name: 'file', //文件名字
  31. header: {
  32. 'Authorization': "Bearer " + getToken(), //token
  33. },
  34. formData: {
  35. type: Object,
  36. default () {
  37. return {
  38. file: item.name
  39. };
  40. }
  41. },
  42. success: res => {
  43. let result = JSON.parse(res.data);
  44. setTimeout(() => {
  45. resolve(result.accessoryUrl)
  46. }, 1000)
  47. },
  48. fail: e => {
  49. console.log(e)
  50. }
  51. });
  52. });
  53. },
  54. // 删除图片
  55. deletePic(event) {
  56. this.imgList.splice(event.index, 1);
  57. }

二、上传或拍摄视频

需要用到uni.chooseVideo 和 uni.uploadFile

详细用法参考

uni.chooseVideo(OBJECT) | uni-app官网

 uni.uploadFile(OBJECT) | uni-app官网

  1. <!-- 视频 -->
  2. <view class="up-video">
  3. <view class="up-label">视频:</view>
  4. <view class="up-video-box">
  5. <view class="v-box" v-show="videoList.length" v-for="(item,i) in videoList" :key="i">
  6. <view class="v-inner">
  7. <video style="width: 172px;height: 72px;" :src="item.accessoryUrl"></video>
  8. </view>
  9. <view class="c-icon">
  10. <u-icon @click="deleteVideo(i)" name="close" color="#fff" size="8"></u-icon>
  11. </view>
  12. </view>
  13. <view class="box-s" @click="videoRead">
  14. <u-icon name="camera-fill" color="#d3d4d6" size="26"></u-icon>
  15. </view>
  16. </view>
  17. <!-- <u-upload :fileList="videoList" @afterRead="videoRead" @delete="deleteVideo" name="2" multiple
  18. :previewFullImage="true" accept="video"></u-upload> -->
  19. </view>
  1. videoRead() {
  2. let that = this;
  3. let arr = [];
  4. let strPath = "";
  5. uni.chooseVideo({
  6. sourceType: ['camera', 'album'],
  7. success: function (res) {
  8. arr = res.tempFilePath.split("/");
  9. strPath = arr[arr.length - 1];
  10. that.videoList.push({
  11. accessoryUrl: res.tempFilePath,
  12. videoName: strPath
  13. });
  14. that.addUpload([{
  15. accessoryUrl: res.tempFilePath,
  16. videoName: strPath
  17. }]);
  18. }
  19. });
  20. },
  21. //文件提交上传
  22. addUpload(videoArr) {
  23. if (videoArr.length) {
  24. videoArr.forEach(item => { //这里之所以循环一个一个上传是因为,我是用于小程序端的,目前uniapp不支持微信小程序以文件列表形式上传,
  25. uni.uploadFile({
  26. url: baseUrl + `/md/quality/uploadVideo`, //需要传图片的后台接口
  27. filePath: item.accessoryUrl, // 上传图片 通过uni-app的uni-file-picker组件 函数返回
  28. name: 'file', //文件名字
  29. header: {
  30. 'Authorization': "Bearer " + getToken(), //token
  31. },
  32. formData: {
  33. type: Object,
  34. default () {
  35. return {
  36. file: item.videoName
  37. };
  38. }
  39. },
  40. success: res => {
  41. let result = JSON.parse(res.data);
  42. this.videoList.map(v => {
  43. if(v.videoName === item.videoName) {
  44. v["accessoryUrl"] = result.accessoryUrl;
  45. }
  46. });
  47. },
  48. fail: e => {
  49. console.log(e)
  50. }
  51. });
  52. });
  53. }
  54. },
  55. deleteVideo(index) {
  56. this.videoList.splice(index, 1);
  57. }
  1. .up-video {
  2. display: flex;
  3. .up-video-box {
  4. width: calc(100% - 105px);
  5. display: flex;
  6. flex-wrap: wrap;
  7. .v-box {
  8. width: 185px;
  9. height: 82px;
  10. position: relative;
  11. overflow: hidden;
  12. margin: 0 8px 8px 0;
  13. padding: 10px 10px 0px 0px;
  14. box-sizing: border-box;
  15. background: #010101;
  16. .v-inner {
  17. position: absolute;
  18. bottom: 0px;
  19. left: 0px;
  20. }
  21. .c-icon {
  22. position: absolute;
  23. top: -7px;
  24. right: -7px;
  25. background: #373737;
  26. border-radius: 50%;
  27. width: 20px;
  28. height: 20px;
  29. display: flex;
  30. justify-content: center;
  31. align-items: center;
  32. padding: 6px 6px 0px 0px;
  33. box-sizing: border-box;
  34. }
  35. }
  36. .box-s {
  37. display: flex;
  38. align-items: center;
  39. justify-content: center;
  40. width: 80px;
  41. height: 80px;
  42. background-color: #f4f5f7;
  43. border-radius: 2px;
  44. margin: 0 8px 8px 0;
  45. box-sizing: border-box;
  46. }
  47. }
  48. }

tips: 代码里的baseUrl 是服务器地址 ip+端口完整地址, getToken()是获取token方法

三、效果展示

 这世界很喧嚣,做你自己就好

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/114699
推荐阅读
相关标签
  

闽ICP备14008679号