分片上传 .net core

@分片上传

#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();
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值