@分片上传
#1.
看到网上好多都是上传分段文件之后在合并文件,个人感觉没有必要!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<img id="img">
<input type="file" id="upload">
<button onclick="loadinfo()">获取图片信息</button>
<button onclick="uploadFileStart()">上传图片信息</button>
</body>
</html>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
- 下面是js部分
<script>
/*显示图片信息*/
function loadinfo() {
var k= document.getElementById("upload");
console.log('%c 🍈 k.files: ', 'font-size:20px;background-color: #42b983;color:#fff;', k.files);
var name= k.files[0].name;
var size= k.files[0].size;
console.log('%c 🍨 k: ', 'font-size:20px;background-color: #6EC1C2;color:#fff;',name);
console.log('%c 🍨 k: ', 'font-size:20px;background-color: #6EC1C2;color:#fff;',size);
var img = document.getElementById("img");
img.width="20";
img.height="20";
img.src = window.URL.createObjectURL( k.files[0]);
img.onload = function (e) {
window.URL.revokeObjectURL(img.src);
}
return k.files[0];
}
//开始上传
function uploadFileStart(params){
const file=loadinfo();
uploadFile(file,0)
}
function uploadFile(file,i) {
var name = file.name, //文件名
size = file.size, //总大小shardSize = 2 * 1024 * 1024,
burstSize = 5* 1024*1024 ,//以2MB为一个分片* 1024
burstCount = Math.ceil(size / burstSize); //总片数
if (i >= shardCount) {
return;
}
//计算每一片的起始与结束位置
var start = i * burstSize, end = Math.min(size, start + burstSize);
let formData=new FormData();
formData.append('file',file.slice(start,end))
formData.append('name',file.name)
formData.append('id',file.lastModified)
formData.append("total", burstCount); //总片数
var num=i+1;//当前是第几片
formData.append("index",num); //当前是第几片
axios.post('*****(后台接口地址)',formData,{"content-type":"multipart/form-data"})
.then(function (response) {
if (num>shardCount) {
return
}
//再次调用
uploadFile(file,num)
})
.catch(function (error) {
});
}
</script>
- .NET CORE 部分
public async Task<IActionResult> CreatVideo([FromForm] IFormCollection formdata)
{
var filesd = Request.Form.Files.FirstOrDefault();
var file = formdata.Files["file"] ;//file文件
var fileName= Request.Form["name"];//文件名称
string[] nameAll = fileName.ToString().Split('.');
string suffix = nameAll[1];//获取后缀名
var id = Request.Form["id"]; //切片ID
var total = Request.Form["total"];//总切片量
var index = Request.Form["index"];//现在切片数
string path = $"/tmp/{id}/{nameAll[0]}";//路径
string physicPath = GetAbsolutePath(path);//获取这个文件的绝对路径
string dir = Path.GetDirectoryName(physicPath);
try
{
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
using (FileStream fs = new FileStream(physicPath, FileMode.Create))
{
file.CopyTo(fs);
}
}
else
{
using (FileStream fs = new FileStream(physicPath, FileMode.Open))
{
using (MemoryStream ms = new MemoryStream())
{
//将文件转为MenoryStream
//再转为byte
file.CopyTo(ms);
byte[] filecontent = ms.ToArray();
//设定书写的开始位置为文件的末尾
fs.Position = fs.Length;
await fs.WriteAsync(filecontent, 0, filecontent.Length);
}
}
if (total == index)
{
Directory.Move(physicPath, physicPath + "." + suffix);
}
}
}
catch (Exception e)
{
throw;
}
return Ok();
}