1.效果

2.数据结构;根据name或url后缀来判断是图片或者视频类型
fileList = [
{name:'123.mp4',url:'123.mp4'},
{name:'124.png',url:'https://img0.baidu.com/it/u=1942253063,3807598283&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500'},
{name:'hahagwe.png',url:'https://img0.baidu.com/it/u=1040225459,210273596&fm=253&fmt=auto&app=138&f=JPEG?w=400&h=400'},
]
3.判断是否是图片或者视频的方法
//图片视频匹配
matchType(name){
//后缀获取
let suffic = '';
//获取类型结果
let result = '';
try {
let fileArr = name.split('.');
suffic = fileArr[fileArr.length - 1]
// console.log('suffic',suffic);
} catch (error) {
suffic = ''
}
//图片格式
var imgList = ['png','jpg','jpeg','bmp','gif'];
//进行图片匹配
result = imgList.some(item=>{
return item === suffic
})
// console.log('结果',result);
if(result){
result = 'image';
// console.log('结果',result);
return result
}
},
4.全部代码展示—>子组件
<template>
<div style="display: inline-flex;">
<div class="img-list-item common mb_10" v-for="(item,index) in fileList" :key="index">
<video v-if="!(matchType(item.name))" :style="{width:w,height:h,margin:'0 9px'}" controls="controls" :src="item.url"> 您的浏览器不支持视频播放</video>
<el-image
v-if="matchType(item.name)"
@mouseover="srcList = [item.url]"
:preview-src-list="srcList"
:style="{width:w,height:h,margin:'0 9px'}"
:src="item.url"
fit="cover"></el-image>
<i class="del-img" @click="forkImage(index)" v-if='isShowImg==true'></i>
</div>
<div v-if="maxlength<limit" @click="change">
<el-upload action="https://hrm-oss-dbg.oss-cn-chengdu.aliyuncs.com"
:data="dataObj" :show-file-list="false"
:auto-upload="true"
:on-remove="handleRemove"
:on-success="handleUploadSuccess"
:before-upload="beforeUpload"
:on-progress="uploadVideoProcess">
<span class="warpss" :style="{width:w,height:h,lineHeight:h}" v-if='isShowImg==true'>
<i v-else class="el-icon-plus" :style="{color:'#8C939D',fontSize: '18px',fontWeight:'bold',padding:paddings}"></i>
</span>
</el-upload>
</div>
</div>
</template>
<script>
import {
policy1
} from '@/api/oss'//oss上传接口
export default {
props: {
//是否需要上传图片(false:需要,true:不需要,只能查看图片不能做任何操作)
isShowImg: {
type: Boolean,
default: false
},
//个数显示
limit:{
type:Number,
default: 5
},
maxlength:{
type:Number
},
value: Array,
//最大上传图片数量
maxCount: {
type: Number,
default: 5
},
//宽度
w: {
type: String,
// default:'100px'
},
//高度
h: {
type: String,
// default:'100px'
},
paddings: {
type: String,
}
},
data: function() {
return {
srcList:[],
videoFlag: false,
isShow:true,
videoUploadPercent: 0,
count:5,
videis: false,
dataObj: {
policy: '',
signature: '',
key: '',
ossaccessKeyId: '',
dir: '',
host: ''
},
dialogVisible: false,
dialogImageUrl: []
}
},
computed: {
fileList() {
this.$emit('videoData23',this.value);
return this.value;
}
},
mounted() {
if(this.fileList.length<this.limit){
this.isShow = true;
}else{
this.isShow = false;
}
},
methods: {
//图片视频匹配
matchType(name){
//后缀获取
let suffic = '';
//获取类型结果
let result = '';
try {
let fileArr = name.split('.');
suffic = fileArr[fileArr.length - 1]
// console.log('suffic',suffic);
} catch (error) {
suffic = ''
}
//图片格式
var imgList = ['png','jpg','jpeg','bmp','gif'];
//进行图片匹配
result = imgList.some(item=>{
return item === suffic
})
// console.log('结果',result);
if(result){
result = 'image';
// console.log('结果',result);
return result
}
},
//删除视频/图片
forkImage(index) {
var data = this.fileList.splice(index, 1);
this.$emit("delFile", this.fileList);
if(this.fileList.length<this.limit){
this.isShow = true;
}else{
this.isShow = false;
}
},
change(){
// console.log('点',this.fileList)
if(this.fileList.length<this.limit){
this.isShow = true;
}else{
this.isShow = false;
}
},
getUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
return (c === 'x' ? (Math.random() * 16 | 0) : ('r&0x3' | '0x8')).toString(16)
})
},
emitInput(fileList) {
let value = [];
for (let i = 0; i < fileList.length; i++) {
value.push(fileList[i].url);
}
this.$emit('input', value)
},
handleRemove(file, fileList) {
this.emitInput(fileList)
},
//上传图片/视频成功后的操作
handleUploadSuccess(res, file) {
console.log("成功后", file)
let url = this.dataObj.host + '/' + this.dataObj.key.replace('${filename}', file.name);
this.fileList.push({
name: file.name,
url: url
});
this.emitInput(this.fileList);
this.dialogVisible = true;
this.videoUploadPercent = 0;
if(this.fileList.length<this.limit){
this.isShow = true;
}else{
this.isShow = false;
this.$message({
message: '最多只能上传' + this.limit + '个视频/张图片',
type: 'warning',
duration: 1000
});
}
},
//进度条
uploadVideoProcess(event, file, fileList) {
// this.videoFlag = true;
this.videoUploadPercent = Math.floor(event.percent);
},
beforeUpload(file) {
// this.videoFlag = true;
//视频/图片校验
if (['video/mp4', 'video/ogg', 'video/flv','video/avi','video/wmv','video/rmvb','image/jpeg','image/PNG','image/gif'].indexOf(file.type) == -1) {
this.$message.error('请上传正确的视频/图片格式');
return false;
}
//以下为oss上传接口
// const _self = this;
// return new Promise((resolve, reject) => {
// policy1().then(response => {
// _self.dataObj.policy = response.data.policy;
// _self.dataObj.signature = response.data.signature;
// _self.dataObj.ossaccessKeyId = response.data.accessid;
// _self.dataObj.key = response.data.dir + this.getUUID() + '_${filename}';
// _self.dataObj.dir = response.data.dir;
// _self.dataObj.host = response.data.host;
// // _self.dataObj.callback = response.data.callback;
// resolve(true)
// }).catch(err => {
// console.log(err)
// reject(false)
// })
// })
},
}
}
</script>
<style lang="scss" scoped>
.warpss {
display: inline-block;
border: 1px dashed #DEE5ED;
}
::v-deep.el-upload-list {
display: none;
}
.el-upload-video {
width: 149px;
height: 149px;
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.el-upload-video-i {
font-size: 20px;
font-weight: bold;
padding-top: 43px;
color: #8c939d;
width: 50px;
height: 50px;
line-height: 50px;
text-align: center;
}
//视频
.img-list-item {
position: relative;
margin: auto;
}
.img-list-item i.del-img {
width: 20px;
height: 20px;
display: inline-block;
background: rgba(0, 0, 0, .6);
background-image: url(../assets/images/close.png);
background-size: 18px;
background-repeat: no-repeat;
background-position: 50%;
position: absolute;
top: 0;
right: 9px;
}
</style>
5.父组件(记得在父组件里面引入并注册子组件哦,在这就写了哈,各位宝儿~)
<template>
<div class="app-container">
<upload-img :isShowImg="isShowImg" :maxlength="slider_image.length" :limit="5" w="150px" h="150px" v-model="slider_image"></upload-img>
</div>
</template>
<script>
export default {
data(){
return{
slider_image:[
{name:'123.mp4',url:'123.mp4'},
{name:'124.png',url:'https://img0.baidu.com/it/u=1942253063,3807598283&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500'},
{name:'hahagwe.png',url:'https://img0.baidu.com/it/u=1040225459,210273596&fm=253&fmt=auto&app=138&f=JPEG?w=400&h=400'},
]
},
methods:{
}
}
</script>
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司
我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
默认情况下:回形针gem将所有附件存储在公共(public)目录中。出于安全原因,我不想将附件存储在公共(public)目录中,所以我将它们保存在应用程序根目录的uploads目录中:classPost我没有指定url选项,因为我不希望每个图像附件都有一个url。如果指定了url:那么拥有该url的任何人都可以访问该图像。这是不安全的。在user#show页面中:我想实际显示图像。如果我使用所有回形针默认设置,那么我可以这样做,因为图像将在公共(public)目录中并且图像将具有一个url:Someimage:看来,如果我将图像附件保存在公共(public)目录之外并且不指定url(同