element的上传文件组件可在action里直接写上传文件的接口,但一般vue+element项目都是封装了axios请求的,所以都会选择适用http-request做自定义上传,我在做这个的过程中遇到的问题:
我的代码是这样子滴:
<el-upload
class="upload-demo"
action="none"
:on-remove="handleRemove"
:before-remove="beforeRemove"
:http-request="uploadFile"
:limit="1"
:on-exceed="handleExceed">
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
</el-upload>
方法代码:
uploadFile(param){
var $this = this;
console.log(param);
var formData = new FormData();
formData.append('file',param.file);
$this.$store.dispatch('api/fileUploadAction', formData).then(response=>{
if(response){
if(response.status){
}else{
$this.$message({
showClose: true,
message: response.info,
type: 'error'
});
}
}
});
},
这里我想打印一下formData
,看一下这是个什么玩意,发现直接console.log
是个空!,然后百度!发现这玩意是不能直接console.log
的,想看看是什么玩意,需要像这样:
formData.forEach(funciton(key,value){
console.log(value);
});
上面可以看到我的请求接口都是通过vuex状态管理的,具体如下:
/** store/modules/api.js **/
import { fileUpload } from '@/api/api'
const actions = {
// 文件上传
fileUploadAction({ commit, state },data) {
return new Promise((resolve, reject) => {
fileUpload(data).then(response => {
resolve(response)
}).catch(error => {
reject(error)
})
})
},
}
export default {
namespaced: true,
state,
mutations,
actions
}
/** api/api.js 接口文件 **/
import request from "@/utils/request";
// 文件上传
export function fileUpload(data) {
return request({
url: "程序接口链接",
method: "POST",
data,
headers:{
isFile:true,
}
});
}
这里是我做了一些处理的地方,我在接口方法中传了headers,新增了一个自定义字段isFile,这个字段主要是为了在封装的请求中使用,因为封装的请求都有拦截器,拦截器里对数据都使用qs.stringify
进行了转化,但是!!! formData的数据是不能转化的,所以这里使用从headers里传的这个字段来判断,当前请求是不是文件上传请求,是的话,就不做操作,直接把参数传给后端,就行了,具体拦截器部分代码如下:
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
withCredentials: true, // send cookies when cross-domain requests
crossDomain:true,
timeout: 50000, // request timeout
url:""
})
// request interceptor
service.interceptors.request.use(
config => {
// do something before request is sent
config.transformRequest=[function(data){
let newData = data;
if(!config.headers.isFile){
for (let i in data) {
if (Array.isArray(data[i])) {
if (data[i].length === 0) {
data[i] = null
}
}
}
newData = Qs.stringify(data);
}
return newData;
}];
console.log(config,"请求数据");
return config
},
error => {
// do something with request error
console.log(error) // for debug
return Promise.reject(error)
}
)
网上也有一些其他的方法去实现,但个人感觉这种可能跟好理解一些,好啦,这样就可以愉快的上传文件啦~!!!