文件的上传下载 完整代码

  • 目录
  • 文件上传
  • 文件下载(请求方式是Get,并且只能用表单请求,否则返回的是流格式 不会自动下载)
  • 下载需要的封装辅助函数

文件上传

[HttpPost]
        public async Task<Result<List<FileUpLoadViewModel>>> UpLoad()
        {
            var result = new Result<List<FileUpLoadViewModel>>();
            var tempList = new List<FileUpLoadViewModel>();
            HttpFileCollection filelist = HttpContext.Current.Request.Files;
            var id = HttpContext.Current.Request["Id"];
            if (string.IsNullOrEmpty(id))
            {
                result.Status = (int)AjaxStatus.返回失败;
                result.Message = "上传文件未设置类型";
                return result;
            }
            var path = _service.GetFileRelation().Result.Data.Where(w => w.TypeId.ToString() == id).Select(s => s.FilePath).ToList()[0];
            if (filelist != null && filelist.Count > 0)
            {
                for (int i = 0; i < filelist.Count; i++)
                {
                    var temp = new FileUpLoadViewModel();
                    HttpPostedFile file = filelist[i];
                    string filename = file.FileName;
                    string savePath = HttpContext.Current.Server.MapPath(path);
                    if (!Directory.Exists(savePath))
                    {
                        Directory.CreateDirectory(savePath);
                    }
                    string filePath = Path.Combine(savePath, Guid.NewGuid() + "." + filename.Split('.')[1]);
                    file.SaveAs(filePath);
                    temp.OldPath = filename;
                    temp.NewPath = WebApiConfig.webStaticResource + filePath;
                    tempList.Add(temp);
                }
                result.Data = tempList;
                result.Status = 200;
            }
            return result;
        }

文件下载(请求方式是Get,并且只能用表单请求,否则返回的是流格式 不会自动下载)

注:(启用FIDDLER时不显式下载速度及进度)

   [HttpGet]
            public HttpResponseMessage GetFileResponse(string path, string FileName = null, string ContentType = "application/octet-stream")
            {
                var browser = String.Empty;
                if (HttpContext.Current.Request.UserAgent != null)
                {
                    browser = HttpContext.Current.Request.UserAgent.ToUpper();
                }
                string filePath = HttpContext.Current.Server.MapPath(path);//路径
                FileName = null != FileName ? FileName : Path.GetFileName(filePath);
                HttpResponseMessage response;
                IWriteStreamToResponse<string> ResponseStreamWriter;
                Action<Stream, HttpContent, TransportContext> sendMethod;
                ResponseStreamWriter = new StreamFromFileName() { Suorce = filePath };
                sendMethod = ResponseStreamWriter.WriteToStream;
                response = Request.CreateResponse();
                response.Content = new System.Net.Http.PushStreamContent(sendMethod);
                response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(ContentType);
                response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                {
                    FileName = browser.Contains("FIREFOX")? System.Web.HttpUtility.HtmlEncode(FileName):System.Web.HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8)
                    //火狐浏览器乱码问题
                    // FileName = System.Web.HttpUtility.HtmlEncode(newFileName)
                };
                return response;
            }

下载需要的封装辅助函数

public interface IWriteStreamToResponse<T>

{

   T Suorce { get; set; }

   void WriteToStream(Stream outputStream, HttpContent content, TransportContext context);

}

public class StreamFromFileName : IWriteStreamToResponse<string>
{
   private string _suorce;
   public string Suorce
   {
       get
       {
           return _suorce;
       }
       set
       {
           _suorce = value;
       }
   }
   
   public async void WriteToStream(Stream outputStream, HttpContent content, TransportContext context)
   {
       try
       {
           var buffer = new byte[1024 * 1024 * 2];
           using (var video = File.Open(_suorce, FileMode.Open, FileAccess.Read, FileShare.Read))
           {
               var length = (int)video.Length;
               var bytesRead = 1;
               while (length > 0 && bytesRead > 0)
               {
                   bytesRead = video.Read(buffer, 0, Math.Min(length, buffer.Length));
                   await outputStream.WriteAsync(buffer, 0, bytesRead);
                   length -= bytesRead;
               }
           }
       }
       catch (Exception ex)
       {
           return;
       }
       finally
       {
           outputStream.Close();
       }
   }
}

public class StreamFromBytes : IWriteStreamToResponse<Stream>
{
   private Stream _source;
   public Stream Suorce
   {
       get
       {
           return _source;
       }
       set
       {
           _source = value;
       }
   }
   public async void WriteToStream(Stream outputStream, HttpContent content, TransportContext context)
   {
       try
       {
           var buffer = new byte[1024 * 1024 * 2];
           using (var video = _source)
           {
               var length = (int)video.Length;
               var bytesRead = 1;
               while (length > 0 && bytesRead > 0)
               {
                   bytesRead = video.Read(buffer, 0, Math.Min(length, buffer.Length));
                   await outputStream.WriteAsync(buffer, 0, bytesRead);
                   length -= bytesRead;
               }
           }
       }
       catch (Exception ex)
       {
           return;
       }
       finally
       {
           _source.Close();
           outputStream.Close();
       }
   }

}

注:专转载请注明出处

猜你喜欢

转载自blog.csdn.net/Street_Walker/article/details/88237828