123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- <template>
- <u-upload @afterRead="afterRead" :maxCount="maxCount" :accept="accept" multiple>
- <view v-if="showLoading">
- <u-loading-icon v-if="loading" />
- <slot v-else />
- </view>
- <slot v-else />
- </u-upload>
- </template>
- <script>
- export default {
- name: "MyUpload",
- props: {
- accept: { //接受的文件类型,file只支持H5(只有微信小程序才支持把accept配置为all、media)
- type: String,
- default: "image"
- },
- maxCount: {
- type: String,
- default: "99"
- },
- parentid: { //上传文件夹ID
- type: [String, Number],
- default: uni.getStorageSync('siteP').appfolderid
- },
- uploadCallback: { //上传回调
- type: Function
- },
- showLoading: {
- type: Boolean,
- default: true
- },
- onLoading: {
- type: Function
- }
- },
- data() {
- return {
- loading: false
- }
- },
- watch: {
- loading: function (newVal) {
- this.$emit("onLoading", newVal)
- }
- },
- methods: {
- afterRead({ file }) {
- const that = this;
- file.forEach(v => {
- // #ifdef H5
- this.getArrayBuffer(v).then(data => that.handleUploadFile(this.requestType(v), data))
- // #endif
- // #ifndef H5
- uni.getFileSystemManager().readFile({
- filePath: v.url,
- success: data => that.handleUploadFile(this.requestType(v), data.data),
- fail: console.error
- })
- // #endif
- });
- },
- /* 请求类型 */
- requestType(file) {
- // #ifdef H5
- var ext = file.name.substr(file.name.lastIndexOf(".") + 1);
- // #endif
- // #ifndef H5
- var ext = file.type.split("/")[1] || file.url.substr(file.url.lastIndexOf(".") + 1) || file.name.substr(file.name.lastIndexOf(".") + 1);
- // #endif
- //文件名称
- return {
- "classname": "system.attachment.huawei.OBS",
- "method": "getFileName",
- "content": {
- "filename": `${Date.now() + file.size}.${ext}`,
- "filetype": ext,
- "parentid": this.parentid
- }
- }
- },
- handleUploadFile(file, data) {
- this.loading = true;
- this.$Http.basic(file).then(res => {
- if (res.msg == "成功") {
- this.uploadFile(res.data, data)
- } else {
- uni.showToast({
- title: `${data.filename}.${data.serialfilename}`,
- icon: "none"
- })
- }
- })
- },
- getArrayBuffer(file) {
- return new Promise((resolve, reject) => {
- let xhr = new XMLHttpRequest()
- xhr.open('GET', file.url, true)
- xhr.responseType = 'blob'
- xhr.onload = function () {
- if (this.status == 200) {
- let myBlob = this.response
- let files = new window.File([myBlob], file.name, { type: file.url.substr(file.url.lastIndexOf(".") + 1) }) // myBlob.type 自定义文件名
- const reader = new FileReader();
- reader.readAsArrayBuffer(files);
- reader.onload = () => resolve(reader.result);
- reader.onerror = (error) => reject(error);
- } else {
- reject(false)
- }
- }
- xhr.send()
- })
- },
- /* 上传成功反馈 */
- uploadFile(res, data) {
- var that = this;
- that.loading = true;
- uni.request({
- url: res.uploadurl,
- method: "PUT",
- data,
- header: {
- 'content-type': 'application/octet-stream'
- },
- success() {
- that.$Http.basic({
- "classname": "system.attachment.huawei.OBS",
- "method": "uploadSuccess",
- "content": {
- "serialfilename": res.serialfilename
- }
- }).then(s => {
- console.log("文件上传反馈", s)
- that.loading = false;
- if (!that.cutoff(s.msg)) that.$emit("uploadCallback", s.data.attachmentids);
- }).catch(err => {
- that.loading = false;
- console.error(err)
- })
- },
- fail(err) {
- that.loading = false;
- console.log(err)
- }
- })
- }
- },
- }
- </script>
|