上传文件与FormData
static内部静态文件(应该在views内,但为了演示方便,放在了static内部,实际使用时应该放在views内)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<input type="file" class="myfile">
<button>点我上传</button>
<script>
document.querySelector("button").onclick = function(){
// 获取到上传的文件
let file = document.querySelector(".myfile").files[0];
// console.log(files);
// 创建FormData对象
let form = new FormData();
// 添加你想上传的内容
form.append("img",file); //将需要上传的文件信息,添加到form
/*
使用form的好处
1. 不需要设置文件头
2. 可以把你的数据可以以键值对的方式存起来
3. 可以添加描述,可以是字符串或者对象
*/
let xhr = new XMLHttpRequest();
// get 无法上传文件,因为他上传都是在头部位置
// 而文件需要通过正文的方式
xhr.open("post","/upload",true);
xhr.onload = function(){
console.log(xhr.responseText);
};
xhr.send(form);
}
</script>
</body>
</html>
服务器文件
const Koa = require("koa");
const static = require("koa-static");
const Router = require("koa-router");
const userData = require("./data/users.json");
const koaBody = require("koa-body");
const fs = require("fs");
const mysql2 = require("mysql2");
const connection = mysql2.createConnection({
host: "localhost",
user: "root",
password: "123321",
database: "js01",
charset: "utf8"
});
let app = new Koa();
let router = new Router();
app.use(koaBody({
multipart: true
}));
app.use(static(__dirname + "/static"));
router.get("/", ctx => {
ctx.body = "hello world"
});
router.post("/upload", async ctx => {
// 将传递过来的文件,读取
let fileData = fs.readFileSync(ctx.request.files.img.path);
// 将读取的文件写入到指定的目录中
fs.writeFileSync("static/imgss/" + ctx.request.files.img.name, fileData);
// 渲染页面
ctx.body = "接收成功";
});
app.use(router.routes());
app.listen(8080);
上传到服务器并渲染到页面
服务器文件
const Koa = require("koa");
const static = require("koa-static");
const Router = require("koa-router");
const userData = require("./data/users.json");
const koaBody = require("koa-body");
const fs = require("fs");
let app = new Koa();
let router = new Router();
app.use(koaBody({
multipart: true
}));
app.use(static(__dirname + "/static"));
router.get("/", ctx => {
ctx.body = "hello world"
});
router.post("/fileUpload", ctx => {
let fileData = fs.readFileSync(ctx.request.files.myfile.path);
fs.writeFileSync("static/imgss/" + ctx.request.files.myfile.name, fileData);
ctx.body = ctx.request.files.myfile.name;
})
app.use(router.routes());
app.listen(8080);
静态文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<input type="file" class="myfile">
<button>点击上传</button>
<img src="" alt="" style="width: 100px; height: 100px;">
<script>
// ajax从点击事件外创建,防止点击一下新建一个ajax
xhr = new XMLHttpRequest();
let btn = document.querySelector("button");
btn.onclick = function(){
// 获取到上传的文件
let file = document.querySelector(".myfile").files[0];
// 实例化FormData;
let form = new FormData();
// 将上传的文件添加到form
form.append("myfile",file);
// 上传 1.上传方式 2.路径 3.是否异步
xhr.open("post","fileUpload",true);
// 接收返回值
xhr.onload = function(){
document.querySelector("img").src = `./imgss/${xhr.responseText}`
};
// 发送服务器
xhr.send(form);
}
</script>
</body>
</html>
上传到数据库并渲染到页面
服务器文件
const Koa = require("koa");
const static = require("koa-static");
const Router = require("koa-router");
const userData = require("./data/users.json");
const koaBody = require("koa-body");
const fs = require("fs");
const mysql2 = require("mysql2");
const connection = mysql2.createConnection({
host: "localhost",
user: "root",
password: "123321",
database: "js01",
charset: "utf8"
});
let app = new Koa();
let router = new Router();
app.use(koaBody({
multipart: true
}));
app.use(static(__dirname + "/static"));
router.get("/", ctx => {
ctx.body = "hello world"
});
router.post("/upload", async ctx => {
// 将传递过来的文件,读取
let fileData = fs.readFileSync(ctx.request.files.img.path);
let imgUrl = "/imgss/" + ctx.request.files.img.name;
console.log(imgUrl)
let sql = "INSERT INTO imgdata (imgUrl) VALUES(?)"
await connection.promise().query(sql, [imgUrl]);
// 将读取的文件写入到指定的目录中
fs.writeFileSync("static/imgss/" + ctx.request.files.img.name, fileData);
// 将文件传入到数据库
ctx.body = "接收成功";
});
router.get("/new", async ctx => {
let mysql = "SELECT * FROM imgData";
let [rows] = await connection.promise().query(mysql);
let data = rows;
ctx.body = {
info: data
}
})
app.use(router.routes());
app.listen(8080);
上传文件页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<input type="file" class="myfile">
<button>点我上传</button>
<script>
document.querySelector("button").onclick = function(){
// 获取到上传的文件
let file = document.querySelector(".myfile").files[0];
// console.log(files);
// 创建FormData对象
let form = new FormData();
// 添加你想上传的内容
form.append("img",file); //将需要上传的文件信息,添加到form
form.append("name","张三");
/*
使用form的好处
1. 不需要设置文件头
2. 可以把你的数据可以以键值对的方式存起来
3. 可以添加描述,可以是字符串或者对象
*/
let xhr = new XMLHttpRequest();
// get 无法上传文件,因为他上传都是在头部位置
// 而文件需要通过正文的方式
xhr.open("post","/upload",true);
xhr.onload = function(){
console.log(xhr.responseText);
};
xhr.send(form);
}
</script>
</body>
</html>
查看文件页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div class="img">
<img src="" alt="">
</div>
<button>点击看图</button>
<script>
let xhr = new XMLHttpRequest();
let i = 0;
document.querySelector('button').onclick = function(){
xhr.open("get","new",true);
xhr.onload = function(){
let imgObj = JSON.parse(xhr.responseText).info;
console.log(imgObj);
let imgUrl = imgObj[i >= imgObj.length ? 0 : i++];
document.querySelector(".img").innerHTML = `<img src = "${imgUrl.imgUrl}">`;
if(i >= imgObj.length){
i = 0;
}
}
xhr.send();
}
</script>
</body>
</html>
upload事件对象
- onloadstart 上传开始
- onprogress 数据传输进行中
- evt.total :需要传输的总大小;
- evt.loaded :当前上传的文件大小;
- onabort 上传操作终止(取消上传)
- onerror 上传失败
- onload 上传成功
- onloadend 上传完成(不论成功与否)
代码示例:
xhr.upload.onloadstart = function(){
console.log('开始上传')
};
xhr.upload.onprogress = function(evt){
console.log('上传中');
// 当前文件上传的大小 : evt.loaded
// 需要传输的总大小 : evt.total
let percent = ((evt.loaded / evt.total) * 100).toFixed(0);
document.querySelector("progress").value = percent;
};
xhr.upload.onload = function(){
console.log("上传成功");
};
xhr.upload.onerror = function(){
console.log("上传失败");
};
xhr.upload.onloadend = function(){
console.log("上传完成");
}