.NET Core 文件上传、下载、文件流转换

通过Webapi下载文件:

//前端请求预览或下载文件(微信小程序也一样)
 [HttpGet]
 public async Task<IActionResult> DownloadYFPreview([FromQuery] string openId, string dbName, string orderName, string id)
        {
            if (openId == null || dbName == null || orderName == null)
                return UnprocessableEntity();
            //从sql server数据库获取下载的文件二进制内容
            PreviewInfoModel infoModel = await _orderApproval.DownloadPreview(openId, dbName, orderName, id);
            if (infoModel == null)
                return null;
            string lastinfo = infoModel.name.Split('.')[1];
            if (lastinfo.Equals("docx"))
                lastinfo = "doc";
            else if (lastinfo.Equals("pptx"))
                lastinfo = "ppt";
            else if (lastinfo.Equals("xlsx"))
                lastinfo = "xls";
            //获取文件的contentType(通过后缀名从json文件中匹配contentType)
            var item = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build().GetSection("contenttype").GetSection(lastinfo).Value;
            //下载文件
            return File(infoModel.buffer, item, infoModel.name);
        }

前端附件预览:

//附件预览
preview: function (id) {
     var _this = this;
     var path = _this.prefix + "/FindOne/" + id;

     hzyAdmin.httpPost(path, {}, function (r) {
          if (r.code !== 1) return;
             //文件流
             var imageBytes = r.data.model.cim002;
             //contentType
             var fileType = r.data.model.cim004;
             var myFile = _this.createFile(imageBytes, fileType);
             var urll = window.URL.createObjectURL(myFile);
             window.open(urll);
             });
},
//转换文件流
createFile: function (urlData, fileType) {
       var bytes = window.atob(urlData),
       n = bytes.length,
       u8arr = new Uint8Array(n);
       while (n--) {
              u8arr[n] = bytes.charCodeAt(n);
                    }
       return new Blob([u8arr], { type: fileType });
}

前端elementUi上传附件:

<div class="col-sm-12">
    <el-upload class="upload-demo"
                           @*上传地址*@
                           action="/Admin/rgwimg/uploadinfo"
                           @*其它请求参数*@
                           :data={id:this.idx,name:this.name}
                           :on-preview="handlePreview"
                           :on-remove="handleRemove"
                           :before-remove="beforeRemove"
                           multiple
                           :on-exceed="handleExceed"
                           :on-success="success"
                           @*选择之后立即上传*@
                           :auto-upload="true"
                           :show-file-list="false">
                    <el-button size="large" type="primary">点击上传</el-button>
     </el-upload>
</div>

后端接收上传附件保存到sql server中:
 

        /// <summary>
        /// 上传附件
        /// </summary>
        /// <param name="file"></param>
        /// <param name="id"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        [HttpPost("uploadinfo")]

        [DisableRequestSizeLimit]
        public async Task<ApiResult> UploadInfo(IFormFile file,[FromForm] string id,[FromForm] string name)
        {
            return this.ResultOk(await this.DefaultService.SaveFormAsync(file, id, name));
        }
        /// <summary>
        /// 保存数据
        /// </summary>
        /// <param name="file"></param>
        /// <param name="id"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        public async Task<rgwimg> SaveFormAsync(IFormFile file,string id,string name)
        {
            BinaryReader r = new BinaryReader(file.OpenReadStream());
            r.BaseStream.Seek(0, SeekOrigin.Begin);    //将文件指针设置到文件开
            
            rgwimg rgwimg = new rgwimg
            {
                cim001 = Guid.Parse(id),
                cim003 = file.FileName,
                cim004 = file.ContentType,
                cim005 = name,
                //文件流转换为byte[],保存到数据库中,sqlserver 字段类别为image
                cim002 = r.ReadBytes((int)r.BaseStream.Length)
            };
            return await this.Repository.InsertOrUpdateAsync(rgwimg);
        }

微信小程序附件预览:

//前端代码 
<view class="rightopera" data-idx="{{item.docId}}" bindtap="download" >
 //预览代码
 download(e){
    const id = e.currentTarget.dataset.idx;
    let tokens=app.globalData.token;
    wx.downloadFile({
    url: 'https://192.168.0.127:44349/api/OrderApproval/DownloadYFPreview?dbName='+this.data.dbname+'&orderName='+this.data.ordername+'&openId='+app.globalData.openid+'&id='+id,
    header:{
      "Authorization": 'Bearer ' +tokens
    },
    success (res) {
      //只要服务器有响应数据,就会把响应内容写入文件并进入 success 回调,业务需要自行判断是否下载到了想要的内容
      if (res.statusCode === 200) {
        var filePath=res.tempFilePath;
        console.log(filePath);
        var reg = RegExp(/.png/);
        if(filePath.match(reg)){
          var img=[];
          img.push(filePath);
          wx.previewImage({
            current: img[0],  //当前预览的图片
            urls: img  //所有要预览的图片
          })
        }else{
          wx.openDocument({
            filePath: filePath,
            success: function (res) {
              console.log('打开文档成功')
            }
          })
        }
      }
    }
  })
  }

小程序前端附件上传:

//前端提交布局代码
<view class="bottomBtn" bindtap="submitForm">提交</view> 

//附件提交代码
 submitForm(e) {
    if (this.data.details == "") {
      wx.showToast({
        title: "请输入评论",
        icon: "loading",
        duration: 1000
      });
      return;
    }
    let time = new Date().getTime();
    let tokens = app.globalData.token;
    this.uploadFile(time, tokens).then(res => {
      if (res.statusCode == "401") {
        request.getLoginInfo(app.globalData.openid).then(res => {
          tokens = res.data.token;
          this.uploadFile(time, tokens).then(res => {
            wx.showToast({
              title: "网络异常,请稍后重试",
              icon: "loading",
              duration: 1000
            });
          });
        });
      } else if (res.statusCode == "200") {
        this.backprevious();
      } else {
        wx.showToast({
          title: "网络异常,请稍后重试",
          icon: "loading",
          duration: 1000
        });
      }
    });
  },
  
uploadFile(time, tokens) {
    var result = true;
    var length = this.data.images.length;
    return new Promise((resolve, reject) => {
      for (let i = 0; i < length; i++) {
        if (!result) break;
        wx.uploadFile({
          url: "https://www.baidu.com/api/OrderApproval/UploadImg",
          filePath: this.data.images[i],
          name: "file",
          header: {
            "Content-Type": "multipart/form-data;application/json;",
            Authorization: "Bearer " + tokens
          },
          formData: {
            orderid: this.data.orderid,
            openid: app.globalData.openid,
            content: this.data.details,
            times: time
          },
          success: function(res) {
            if (res.statusCode == "401") {
              result = false;
              resolve(res);
            }
            if (i == length - 1 && res.statusCode == "200") {
              resolve(res);
            }
          },
          fail: function(err) {
            result = false;
            reject(err);
          },
          complete: function(res) {
            wx.showToast({
              title: "上传" + i + "  code:" + res.statusCode+"  errMsg:"+res.errMsg,
              icon: "loading",
              duration: 1000
            });
          }
        });
      }
    });
  }

后端接收附件保存到服务器指定文件夹:

/// <summary>
        /// 上传图片,通过Form表单提交
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        //[DisableRequestSizeLimit] //不限制请求头model的大小
        //[RequestSizeLimit(100_000_000)] //请求大小值为100,000,000 字节
        public async Task<IActionResult> UploadImg()
        {
            commentModel commentModel = new commentModel();
            if (Request.Form.TryGetValue("orderid", out StringValues orderid))
                commentModel.orderid = orderid.ToString();
            if (Request.Form.TryGetValue("openid", out StringValues openid))
                commentModel.openid = openid.ToString(); 
            if (Request.Form.TryGetValue("content", out StringValues content))
                commentModel.content = content.ToString();
            if (Request.Form.TryGetValue("times", out StringValues times))
                commentModel.times = times.ToString();

            var sx = Request.Form.Files["file"];
            var now = DateTime.Now;
            var pathdate = now.ToString("yyyy") + now.ToString("MM") + now.ToString("dd");
            //文件存储路径
            var filePath = string.Format("/Uploads/{0}/{1}/{2}/", now.ToString("yyyy"), now.ToString("MM"), now.ToString("dd"));
            //获取当前web目录
            var webRootPath = Directory.GetCurrentDirectory();
            if (!Directory.Exists(webRootPath + filePath))
            {
                Directory.CreateDirectory(webRootPath + filePath);
            }
            try
            {
                var fileExtension = Path.GetExtension(sx.FileName);
                var strDateTime = DateTime.Now.ToString("yyMMddhhmmssfff"); //取得时间字符串
                var strRan = Convert.ToString(new Random().Next(100, 999)); //生成三位随机数
                var saveName = strDateTime + strRan + fileExtension;
                string path = webRootPath + filePath + pathdate + saveName;
                using (FileStream fs = System.IO.File.Create(path))
                {
                    sx.CopyTo(fs);
                    fs.Flush();
                }
                commentModel.picAddress = pathdate + saveName;
                bool result = await _orderApproval.SavePics(commentModel);
                if (!result)
                    return BadRequest("保存失败,请稍后重试");
                return Ok();
            }
            catch (Exception ex)
            {
                return BadRequest();
            }
        }

流转换:

//byte[]直接转换内存流,供下载使用
byte[] buffer=new byte[1000];
MemoryStream ms = new MemoryStream(buffer);
ms.Write(buffer, 0, buffer.Length);
ms.Position = 0;
ms.Seek(0, SeekOrigin.Begin);
return new FileContentResult(buffer, "image/png");
//FileStream转为MemoryStream,再转为byte[]
byte[] StreamToFile(FileStream fileStream, MemoryStream memoryStream)
        {
            byte[] files = new byte[0];
            byte[] fileBytes = new byte[fileStream.Length];
            fileStream.Read(fileBytes, 0, (int)fileStream.Length);
            memoryStream.Write(fileBytes, 0, (int)fileStream.Length);
            files= memoryStream.ToArray();
            fileStream.Close();
            memoryStream.Close();
            return files;
        }

读取网络共享文件:

参考:https://www.cjavapy.com/article/395/
byte[] files=new byte[0];
var folder = new SmbFile("smb://Administrator:123@192.168.0.84/YFATTACH/0010000132.001");
if (!folder.Exists())
   return files;
//获取可读的流
var readStream = folder.GetInputStream();
//获取 bytes.
((Stream)readStream).CopyTo(memStream);
 //Dispose可读的流。
readStream.Dispose();
files= memoryStream.ToArray();
return files;

把网络共享文件读到本地:

byte[] ReadFile(string path,string fileId,string fileName)
        {
            byte[] files = new byte[0];
            string filepath = Directory.GetCurrentDirectory() + "/Files/";
            string oldFileName = $"{filepath}/{fileId}";
            string newFileName = $"{filepath}/{fileName}";

            FileStream fileStream = null;
            //判断文件是否存在
            bool isExists = File.Exists($"{filepath}/{fileName}");
            if (isExists)
                //若存在,则读取文件到内存
                fileStream = new FileStream($"{filepath}/{fileName}", FileMode.Open);
            //创建读取缓存
            var memStream = new MemoryStream();

            if (!isExists)
            { 
                //var folder = new SmbFile("smb://Administrator:123@192.168.0.84/YFATTACH/0010000132.001");
                var folder = new SmbFile($"smb://{path}");
                if (!folder.Exists())
                    return files;
                //获取可读的流。
                var readStream = folder.GetInputStream();
                //获取 bytes.
                ((Stream)readStream).CopyTo(memStream);

                //Dispose可读的流。
                readStream.Dispose();
                
                if (!Directory.Exists(filepath))
                {
                    Directory.CreateDirectory(filepath);
                }
                
                string filesName = filepath + folder.GetName();

                using (FileStream fls = System.IO.File.Create(filesName))
                {
                    //内存流转为文件流,并写入磁盘
                    fls.Write(memStream.ToArray(), 0, memStream.ToArray().Length);
                    fls.Close();
                }

                //重命名文件名及扩张名
                File.Copy(oldFileName, newFileName);
                
                fileStream = new FileStream($"{filepath}/{fileName}", FileMode.Open);
                if (fileStream.Length > 0)
                    files= StreamToFile(fileStream, memStream);
            }
            else
                files= StreamToFile(fileStream, memStream);

            //删除指定文件
            File.Delete(oldFileName);
            File.Delete(newFileName);
            
            return files;
        }

        byte[] StreamToFile(FileStream fileStream, MemoryStream memoryStream)
        {
            byte[] files = new byte[0];
            byte[] fileBytes = new byte[fileStream.Length];
            fileStream.Read(fileBytes, 0, (int)fileStream.Length);
            memoryStream.Write(fileBytes, 0, (int)fileStream.Length);
            files= memoryStream.ToArray();
            fileStream.Close();
            memoryStream.Close();
            return files;
        }

谢谢打赏:

   

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值