• 下载超大文件的控件


    一、实现步骤


    在用户操作界面,由用户选择需要下载的文件,系统根据所选文件,在服务器上创建用于存储所选文件的临时文件夹,将所选文件拷贝至临时文件夹。然后调用 RAR程序,对临时文件夹进行压缩,然后输出到客户端。最后删除临时文件夹。

    二、代码实现

    1、ASP.NET批量下载 核心代码

    代码如下:

    //遍历服务器指定文件夹下的所有文件

    string path = "uploads/Image/";

    string serverPath = Server.MapPath(path);

    //创建临时文件夹

    string tempName = DateTime.Now.ToString("yyyyMMddHHMMss");

    string tempFolder = Path.Combine(serverPath, tempName);

    Directory.CreateDirectory(tempFolder);

    DirectoryInfo folder = new DirectoryInfo(serverPath);

    foreach (FileInfo file in folder.GetFiles())

    {

    string filename = file.Name;

    File.Copy(serverPath + "/" + filename, tempFolder + "/" + filename);

    }

    //ZKHelper.JSHelper.Alert("图片拷贝成功!");

    //产生RAR文件,及文件输出

    RARSave(tempFolder, tempName);

    DownloadRAR(tempFolder + "\\" + tempName + ".rar");


    2、RARSave(string tempFolder, string tempName) 方法

    代码如下:

    ///

    /// 生成RAR文件

    ///

    /// 存放复制文件的目录

    /// RAR文件存放目录

    /// RAR文件名

    private void RARSave(string rarPatch, string rarName)

    {

    string the_rar;

    RegistryKey the_Reg;

    Object the_Obj;

    string the_Info;

    ProcessStartInfo the_StartInfo;

    Process the_Process;

    try

    {

    the_Reg = Registry.ClassesRoot.OpenSubKey(@"WinRAR");

    the_Obj = the_Reg.GetValue("");

    the_rar = the_Obj.ToString();

    the_Reg.Close();

    the_rar = the_rar.Substring(1, the_rar.Length - 7);

    the_Info = " a " + rarName + " -r";

    the_StartInfo = new ProcessStartInfo();

    the_StartInfo.FileName = "WinRar";//the_rar;

    the_StartInfo.Arguments = the_Info;

    the_StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

    //打包文件存放目录

    the_StartInfo.WorkingDirectory = rarPatch;

    the_Process = new Process();

    the_Process.StartInfo = the_StartInfo;

    the_Process.Start();

    the_Process.WaitForExit();

    the_Process.Close();

    }

    catch (Exception)

    {

    throw;

    }

    }


    3、DownloadRAR(string file)方法

    代码如下:

    ///

    /// 下载生成的RAR文件

    ///

    private void DownloadRAR(string file)

    {

    FileInfo fileInfo = new FileInfo(file);

    Response.Clear();

    Response.ClearContent();

    Response.ClearHeaders();

    Response.AddHeader("Content-Disposition", "attachment;filename=" + fileInfo.Name);

    Response.AddHeader("Content-Length", fileInfo.Length.ToString());

    Response.AddHeader("Content-Transfer-Encoding", "binary");

    Response.ContentType = "application/octet-stream";

    Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");

    Response.WriteFile(fileInfo.FullName);

    Response.Flush();

    string tempPath = file.Substring(0, file.LastIndexOf("\\"));

    //删除临时目录下的所有文件

    DeleteFiles(tempPath);

    //删除空目录

    Directory.Delete(tempPath);

    Response.End();

    }

    4、DeleteFiles(string tempPath) 方法

    代码如下:

    ///

    /// 删除临时目录下的所有文件

    ///

    /// 临时目录路径

    private void DeleteFiles(string tempPath)

    {

    DirectoryInfo directory = new DirectoryInfo(tempPath);

    try

    {

    foreach (FileInfo file in directory.GetFiles())

    {

    if (file.Attributes.ToString().IndexOf("ReadOnly") != -1)

    {

    file.Attributes = FileAttributes.Normal;

    }

    File.Delete(file.FullName);

    }

    }

    catch (Exception)

    {

    throw;

    }

    }

    详细配置与控件信息可以参考我写的这篇文章:http://blog.ncmem.com/wordpress/2019/08/28/net%E6%96%87%E4%BB%B6%E6%89%B9%E9%87%8F%E4%B8%8B%E8%BD%BD/

  • 相关阅读:
    【get√】发现一个redis zset的新玩法:用ZINTERSTORE把value都置0
    【记录一个问题】golang神坑,明明返回了接口指针类型的nil值,却无法用if判断
    【记录一个问题】神坑,自定义一个golang的error类型,居然运行崩溃了
    【解决了一个小问题】golang protocol buffers 3中去掉json标签中的omitempty
    【转载】select case break引发的血案
    【记录一个问题】redis中执行事务出现错误“EXECABORT Transaction discarded because of previous errors”
    【get√】golang中实现从腾讯云CVM查询网卡流量的两种方法
    【get√】golang新手理解了一点点context
    【get√】golang新手理解了一点点gin框架的中间件
    1066. 图像过滤(15)
  • 原文地址:https://www.cnblogs.com/songsu/p/11301786.html
Copyright © 2020-2023  润新知