1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
  | <template> 
 |      <div class="file"> 
 |          <div class="file_list"> 
 |              <div class="file_list_item" :style="{width: width, height: height}" v-for="(item, index) in list" :key="index"> 
 |                  <div class="dele" @click="deleItem(index)"> 
 |                      <i class="el-icon-close"></i> 
 |                  </div> 
 |                  <img :src="item.fileurlFull" v-if="fileType(item.fileurlFull) === 'img'" /> 
 |                  <video controls autoplay :src="item.fileurlFull" v-else></video> 
 |              </div> 
 |              <div v-if="list ==null || list.length == 0 || list.length < maxLength" class="file_list_item" :style="{width: width, height: height, cursor: 'pointer'}" @click="$refs.file.click()"> 
 |                  <i class="el-icon-plus"></i> 
 |              </div> 
 |          </div> 
 |          <input   type="file" ref="file" :accept="accept" @change="getFile" /> 
 |      </div> 
 |  </template> 
 |    
 |  <script> 
 |  import axios from 'axios' 
 |  export default { 
 |    props: { 
 |      width: { 
 |        type: String, 
 |        default: '90px' 
 |      }, 
 |      height: { 
 |        type: String, 
 |        default: '90px' 
 |      }, 
 |      list: { 
 |        type: Array, 
 |        default: [] 
 |      }, 
 |      accept: { 
 |        type: String, 
 |        default: '' 
 |      }, 
 |      folder: { 
 |        type: String, 
 |        default: '' 
 |      }, 
 |      maxLength: { 
 |        type: Number, 
 |        default: 9999 
 |      } 
 |    }, 
 |    data () { 
 |      return { 
 |        uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/upload' 
 |      } 
 |    }, 
 |    methods: { 
 |      fileType (url) { 
 |        if (url && url.indexOf('.mp4') !== -1) { 
 |          return 'video' 
 |        } else { 
 |          return 'img' 
 |        } 
 |      }, 
 |      getFile (e) { 
 |        if (e.target && e.target.files.length > 0) { 
 |          this.$emit('loading') 
 |          const formdate = new FormData() 
 |          formdate.append('file', e.target.files[0]) 
 |          formdate.append('folder', this.folder) 
 |          axios.post(this.uploadImgUrl, formdate) 
 |            .then(res => { 
 |              this.$emit('success', res.data.data) 
 |            }) 
 |            .catch(e => { 
 |              this.$message.error(e) 
 |            }) 
 |            .finally(() => { 
 |              this.$refs.file.value = null 
 |            }) 
 |        } 
 |      }, 
 |      deleItem (index) { 
 |        this.$emit('dele', index) 
 |      } 
 |    } 
 |  } 
 |  </script> 
 |    
 |  <style lang="scss" scoped> 
 |      .file { 
 |          /*width: 100%;*/ 
 |          /*height: 90px;*/ 
 |          margin: 10px 0; 
 |          input { 
 |              opacity: 0; 
 |          } 
 |          .file_list { 
 |              width: 100%; 
 |              height: 100%; 
 |              display: flex; 
 |              align-items: center; 
 |              flex-wrap: wrap; 
 |              .file_list_item { 
 |                  display: flex; 
 |                  flex-direction: column; 
 |                  align-items: center; 
 |                  justify-content: center; 
 |                  overflow: hidden; 
 |                  border-radius: 5px; 
 |                  border: 1px solid #d5d5d5; 
 |                  margin-left: 15px; 
 |                  position: relative; 
 |                  &:first-child { 
 |                      margin: 0 !important; 
 |                  } 
 |                  .dele { 
 |                    z-index: 10000; 
 |                      position: absolute; 
 |                      right: 0; 
 |                      top: 0; 
 |                      width: 20px; 
 |                      height: 20px; 
 |                      background: red; 
 |                      display: flex; 
 |                      align-items: center; 
 |                      justify-content: center; 
 |                      cursor: pointer; 
 |                      .el-icon-close { 
 |                          color: #ffffff; 
 |                          font-size: 19px; 
 |                      } 
 |                  } 
 |                  .el-icon-plus { 
 |                      font-size: 30px; 
 |                      color: black; 
 |                  } 
 |                  img { 
 |                      width: 100%; 
 |                  } 
 |                  video { 
 |                      width: 100%; 
 |                      height: 100%; 
 |                  } 
 |              } 
 |          } 
 |      } 
 |  </style> 
 |  
  |