zoukankan      html  css  js  c++  java
  • 文件下载(服务器和客户端)

    通过接口下载文件(服务器和客户端)
    
    客户端:
    
    /// <summary>
    /// 下载文件
    /// </summary>
    /// <param name="URL">下载文件地址</param>
    /// <param name="Filename">下载后的文件目录(全路径)</param>
    private string DownloadFile(string URL, string filename)
    {
    try
    {
    string fName = "site" + DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".zip";
    System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(URL);
    System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse();
    System.IO.Stream st = myrp.GetResponseStream();
    System.IO.Stream so = new System.IO.FileStream(filename + "\" + fName, System.IO.FileMode.Create);
    byte[] by = new byte[1024];
    int osize = st.Read(by, 0, (int)by.Length);
    while (osize > 0)
    {
    so.Write(by, 0, osize);
    osize = st.Read(by, 0, (int)by.Length);
    }
    so.Close();
    st.Close();
    myrp.Close();
    Myrq.Abort();
    return fName;
    }
    catch (Exception ex)
    {
    MessageBox.Show("下载错误!" + ex.Message);
    return null;
    }
    }
    
    服务器端:
    using FundMgmt.SH.WebApi.Providers;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Web.Http;
    public class FileDownloadController : BaseApi
    {
    /// <summary>
    /// 下载网站发布文件
    /// </summary>
    /// <returns></returns>
    [HttpGet]
    [Route("g")]
    public HttpResponseMessage DownFiles()
    {
    FileProvider = new FileProvider("SiteDownloadDir");
    System.IO.FileInfo []fis=FileProvider.FindFile();
    if (fis != null)
    {
    string fileName = fis[0].Name;
    long fileLength = FileProvider.GetLength(fileName);
    var fileInfo = GetFileInfoFromRequest(this.Request, fileLength);
    //获取剩余部分文件流
    var stream = new PartialContentFileStream(FileProvider.Open(fileName),
    fileInfo.From, fileInfo.To);
    var response = new HttpResponseMessage();
    response.Content = new StreamContent(stream, BufferSize);
    SetResponseHeaders(response, fileInfo, fileLength, fileName);
    return response;
    }
    else {
    throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    }
    }
    
    以下为服务器上的文件帮助类
    :
    
    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.IO;
    using System.Linq;
    using System.Web;
    using System.Web.Hosting;
    
    namespace FundMgmt.SH.WebApi.Providers
    {
    /// <summary>
    /// 文件操作
    /// </summary>
    public class FileProvider
    {
    private readonly string _filesDirectory;
    private const string AppSettingsKey = "SiteDownloadDir";
    
    public FileProvider()
    {
    
    }
    /// <summary>
    /// 获取文件的物理路径,在接口文件夹
    /// </summary>
    /// <param name="dir"></param>
    public FileProvider(string dir)
    {
    var fileLocation = ConfigurationManager.AppSettings[dir];
    if (!String.IsNullOrWhiteSpace(fileLocation))
    {
    _filesDirectory = HostingEnvironment.MapPath(fileLocation);
    }
    }
    
    /// <summary>
    /// 判断文件是否存在
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    public bool Exists(string name)
    {
    string file = Directory.GetFiles(_filesDirectory, name, SearchOption.TopDirectoryOnly)
    .FirstOrDefault();
    return true;
    }
    
    /// <summary>
    /// 获取文件夹里的文件
    /// </summary>
    /// <returns></returns>
    public FileInfo[] FindFile()
    {
    DirectoryInfo di=new DirectoryInfo(_filesDirectory);
    FileInfo[] fis = di.GetFiles();
    return fis;
    }
    
    /// <summary>
    /// 打开文件
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    public FileStream Open(string name)
    {
    var fullFilePath = Path.Combine(_filesDirectory, name);
    return File.Open(fullFilePath,
    FileMode.Open, FileAccess.Read, FileShare.Read);
    }
    
    /// <summary>
    /// 获取文件长度
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    public long GetLength(string name)
    {
    var fullFilePath = Path.Combine(_filesDirectory, name);
    return new System.IO.FileInfo(fullFilePath).Length;
    }
    ///<summary>
    /// 清空指定的文件夹,但不删除文件夹
    /// </summary>
    /// <param name="dir"></param>
    public void DeleteFolder(string dir)
    {
    foreach (string d in Directory.GetFileSystemEntries(dir))
    {
    if (File.Exists(d))
    {
    FileInfo fi = new FileInfo(d);
    if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1)
    fi.Attributes = FileAttributes.Normal;
    File.Delete(d);//直接删除其中的文件
    }
    else
    {
    DirectoryInfo d1 = new DirectoryInfo(d);
    if (d1.GetFiles().Length != 0)
    {
    DeleteFolder(d1.FullName);////递归删除子文件夹
    }
    Directory.Delete(d);
    }
    }
    }
    /// <summary>
    /// 删除文件夹及其内容
    /// </summary>
    /// <param name="dir"></param>
    public void DeleteFolder1(string dir)
    {
    foreach (string d in Directory.GetFileSystemEntries(dir))
    {
    if (File.Exists(d))
    {
    FileInfo fi = new FileInfo(d);
    if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1)
    fi.Attributes = FileAttributes.Normal;
    File.Delete(d);//直接删除其中的文件
    }
    else
    DeleteFolder(d);////递归删除子文件夹
    Directory.Delete(d);
    }
    }
    
    /// <summary>
    /// 清空文件夹
    /// </summary>
    /// <param name="dir"></param>
    public void ClearFolder()
    {
    foreach (string d in Directory.GetFileSystemEntries(_filesDirectory))
    {
    if (File.Exists(d))
    {
    FileInfo fi = new FileInfo(d);
    if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1)
    fi.Attributes = FileAttributes.Normal;
    File.Delete(d);//直接删除其中的文件
    }
    }
    }
    
    
    }
    
    }
    
    /// <summary>
    /// 根据请求信息赋予封装的文件信息类
    /// </summary>
    /// <param name="request"></param>
    /// <param name="entityLength"></param>
    /// <returns></returns>
    private FileInfo GetFileInfoFromRequest(HttpRequestMessage request, long entityLength)
    {
    var fileInfo = new FileInfo
    {
    From = 0,
    To = entityLength - 1,
    IsPartial = false,
    Length = entityLength
    };
    var rangeHeader = request.Headers.Range;
    if (rangeHeader != null && rangeHeader.Ranges.Count != 0)
    {
    if (rangeHeader.Ranges.Count > 1)
    {
    throw new HttpResponseException(HttpStatusCode.RequestedRangeNotSatisfiable);
    }
    RangeItemHeaderValue range = rangeHeader.Ranges.First();
    if (range.From.HasValue && range.From < 0 || range.To.HasValue && range.To > entityLength - 1)
    {
    throw new HttpResponseException(HttpStatusCode.RequestedRangeNotSatisfiable);
    }
    
    fileInfo.From = range.From ?? 0;
    fileInfo.To = range.To ?? entityLength - 1;
    fileInfo.IsPartial = true;
    fileInfo.Length = entityLength;
    if (range.From.HasValue && range.To.HasValue)
    {
    fileInfo.Length = range.To.Value - range.From.Value + 1;
    }
    else if (range.From.HasValue)
    {
    fileInfo.Length = entityLength - range.From.Value + 1;
    }
    else if (range.To.HasValue)
    {
    fileInfo.Length = range.To.Value + 1;
    }
    }
    
    return fileInfo;
    }
    
    /// <summary>
    /// 设置响应头信息
    /// </summary>
    /// <param name="response"></param>
    /// <param name="fileInfo"></param>
    /// <param name="fileLength"></param>
    /// <param name="fileName"></param>
    private void SetResponseHeaders(HttpResponseMessage response, FileInfo fileInfo,
    long fileLength, string fileName)
    {
    response.Headers.AcceptRanges.Add("bytes");
    response.StatusCode = fileInfo.IsPartial ? HttpStatusCode.PartialContent
    : HttpStatusCode.OK;
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
    response.Content.Headers.ContentDisposition.FileName = fileName;
    response.Content.Headers.ContentType = new MediaTypeHeaderValue(MimeType);
    response.Content.Headers.ContentLength = fileInfo.Length;
    if (fileInfo.IsPartial)
    {
    response.Content.Headers.ContentRange
    = new ContentRangeHeaderValue(fileInfo.From, fileInfo.To, fileLength);
    }
    }
    
    //下载的文件信息
    public class FileInfo
    {
    public long From;
    public long To;
    public bool IsPartial;
    public long Length;
    
    }
    在config中配置文件的文件的路径 add key="SiteDownloadDir" value="~/Files/Site" / add key="SqlDownloadDir" value="~/Files/Sql" /
    

      

  • 相关阅读:
    Redis分布式锁的正确实现方式
    Redis+Jedis封装工具类
    MyCat配置文件详解--server.xml
    linux buff/cache释放
    mycat中间件--schema.xml配置文件详解
    mycat中间件--linux安装mycat1.6版本
    如何查找SHELL的进程号并杀死
    dubbo常用配置及注意事项
    xxxx
    解决docker镜像无法下载的问题
  • 原文地址:https://www.cnblogs.com/hnzheng/p/12626993.html
Copyright © 2011-2022 走看看