Vue上傳文件html
經過input使用自定義按鈕上傳本地圖片到服務器上,寫學校項目的時候有用到,記錄一下省得之後忘記前端
前端代碼ios
//上傳按鈕axios
點擊選擇須要上傳的圖片跨域
@change="changeImage()"服務器
ref="avatarInput"app
>cors
上傳圖片框架
input隱藏,綁定onchange事件,在自定義的div上使用方法出發input的方法koa
js的代碼
//js代碼
selectLoadImg() {
this.$refs.avatarInput.dispatchEvent(new MouseEvent("click"));
},
changeImage() {
let files = this.$refs.avatarInput.files;
let that = this;
function readAndPreview(file) {
that.file = file
if (/\.(jpe?g|png|gif)$/i.test(file.name)) {
let reader = new FileReader();
reader.onload = function() {
if (that.imgData !== this.result) {
that.imgData = this.result // 這個是base64的數據格式
}
};
reader.readAsDataURL(file);
}
}
if (files) {
[].forEach.call(files, readAndPreview);
}
}
upLoad() {
let imgFile = this.file;//獲取到上傳的圖片
let formData = new FormData();//經過formdata上傳
formData.append('file', imgFile)
formData.append('userId', this.userId)
this.axios({
method: "post",
url: "接口地址",
data: formData,
core: true
})
.then((res) => {
console.log(res.data);
})
.catch((error) => {
console.log(error);
})
},
主要使用了axios以及FormData進行數據的上傳
後臺的代碼
智匯代理申請https://www.kaifx.cn/broker/t...
使用的是koa框架進行接收前端發送的圖片
const Router = require('koa-router')
const koa = require('koa');
const cors = require('koa-cors');
const koaBody = require('koa-body');
const fs = require('fs')
const path = require('path')
const app = new koa();
router = new Router()
app.use(cors()); // 用於解決跨域的問題
app.use(koaBody({
multipart: true, // 開啓文件上傳,必須設置爲true
strict: false,
formidable: {
maxFileSize: 200 * 1024 * 1024, // 設置上傳文件大小最大限制,默認2M
keepExtensions: true // 保留文件拓展名
}
}))
app.use(require('koa-static')(__dirname + '/public'))
router.post('/upLoad', async (ctx) => {
console.log(ctx.request.files.file) // 打印文件內容
console.log(ctx.request.body) // 打印FormData的護具
const file = ctx.request.files.file; // 獲取上傳文件
// 建立可讀流
const reader = fs.createReadStream(file.path);
let filePath = path.join(__dirname, 'public/upload/') + `${file.name}`;
// 建立可寫流
const upStream = fs.createWriteStream(filePath);
// 可讀流經過管道寫入可寫流
reader.pipe(upStream);
console.log(filePath)
ctx.body = {
msg: '上傳成功!',
url:filePath
};
})
// 裝載子路由
router.use('/upLoad', router.routes(), router.allowedMethods())
// 加載路由中間件
app.use(router.routes()).use(router.allowedMethods())
app.listen(3000, () => {
console.log("listening port 3000");
})