C#利用ICSharpCode将远程文件打包并下载

方法主体代码:

public void GetFilesByOrder(string Order_ID, string IntNumber)
{
MemoryStream ms = new MemoryStream();
byte[] buffer = null;

List<MaterialInfo> mList = mBll.SelectEntitys(m => m.Owner_ID == Order_ID);

using (ZipFile file = ZipFile.Create(ms))
{
file.BeginUpdate();
foreach (var item in mList)
{
UrlDataSource data = new UrlDataSource(CommonData.ApiFilePathBase + "Order/" + item.SaveName);
file.Add(data, item.Name);
}
file.CommitUpdate();
buffer = new byte[ms.Length];
ms.Position = 0;
ms.Read(buffer, 0, buffer.Length);
}
Response.AddHeader("content-disposition", "attachment;filename=" + IntNumber + ".zip");
Response.BinaryWrite(buffer);
Response.Flush();
Response.End();
}

此处关键点有:

  1.我不想在本地保存压缩包之后再下载,所以“ZipFile.Create(ms)”直接创建到内存里面

  2.我的文件不是在本地的,在远程服务器上,所以“file.Add”不能直接添加路径,需要实现IStaticDataSource接口

对IStaticDataSource的实现:

public class UrlDataSource : IStaticDataSource
{
public string Url { get; set; }

public UrlDataSource(string url)
{
this.Url = url;
}

public Stream GetSource()
{
return GetStreamUrl();
}
public Stream GetStreamUrl()
{
try
{
WebRequest req = WebRequest.Create(Url);
WebResponse result = req.GetResponse();

MemoryStream ms = new MemoryStream();
result.GetResponseStream().CopyTo(ms);

ms.Position = 0;
return ms;
}
catch
{
}
return null;
}
}

实际做的时候调试了很多次,都是下载下来的压缩包里面的文件是空的,最后才发现一个非常容易忽略的问题,就是在把文件流保存到内存里面后没有把位置设为0“ms.Position = 0;”,此时的位置是文件流的末尾,所以保存下来的文件是空的,解决这个问题后,就顺利实现了打包下载。

时间: 2024-10-09 03:59:39

C#利用ICSharpCode将远程文件打包并下载的相关文章

利用JAVA获取远程文件及使用断点续传 供学习者使用

闲来没事,就做做,程序还是要多写才好@ 原理不说,文件方面及I/O方面,去BAIDU一下就知道,断点续传的原理也很简单,就是在原来已经下载的基础之上继续下载就可以了,用到了这么关键的一句:urlc.setRequestProperty("RANGE", "bytes="+fileSize+"-"); 其它就应该很简单吧. /** * 文件传送客户端:获取远程文件,并采用断点续传原理 * 软件很简单,写这个东东经历了三个步子: * 1.写了一个文件

Asp.Net Web Api 2 实现多文件打包并下载文件示例源码_转

一篇关于Asp.Net Web Api下载文件的文章,之前我也写过类似的文章,请见:<ASP.NET(C#) Web Api通过文件流下载文件到本地实例>本文以这篇文章的基础,提供了ByteArrayContent的下载以及在下载多个文件时实现在服务器对多文件进行压缩打包后下载的功能.关于本文中实现的在服务器端用.NET压缩打包文件功能的过程中,使用到了一个第方类库:DotNetZip,具体的使用将在正文中涉及.好了,描述了这么多前言,下面我们进入本文示例的正文. 一.创建项目 1.1 首先创

Web端文件打包.zip下载

使用ant.jar包的API进行文件夹打包.直接上代码: 1 String zipfilename = "test.zip"; 2 File zipfile = new File(zipfilename); 3 org.apache.tools.ant.types.FileSet fileSet = new FileSet(); 4 org.apache.tools.ant.Project prj = new Project(); 5 org.apache.tools.ant.task

文件打包,下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件

总结: 使用PHP下载文件的操作需要给出四个header(),可以参考我的另一篇博文:PHP如何实现下载功能超详细流程分析 计算文件的大小的时候,并不需要先打开文件,通过filesize($filename)就可以看出,如果需要先打开文件的话,filesize可能就会是这样的形式了filesize($filehandle) 向客户端回送数据的是,记得要设置一个buffer,用来指定每次向客户端输出多少数据,如:$buffer=1023.如果不指定的话,就会将整个文件全部写入内存当中,再一次性的讲

java 利用SMB读取远程文件

Java代码   package com.yss.test.FileReadWriter; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.In

(七)利用apache组件进行文件上传下载

一.文件上传 文件上传,即服务器端得到并处理用户上传的文件,这个文件存放在request里,也就是需要对request进行处理. 1.1 编写html文件 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action=&q

使用 urllib 打开、匹配和保存远程文件

利用 urlretrieve 获取远程文件保存到本地 from urllib.request import urlretrieve urlretrieve('http://www.python.org',r'D:\python\python37\python_wegpage.html') 利用 urlopen 和 re 匹配获取远程文件中的数据 from urllib.request import urlopen import re wegpage = urlopen('http://www.p

PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 &amp;&amp; Linux下的ZipArchive配置开启压缩

PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP 扩展已经开启,具体开启方法就不说了,不同的平台开启PHP扩增的方法网上都有,如有疑问欢迎交流.这里整理一下常用的示例供参考. 一.解压缩zip文件 ? 1 2 3 4 5 6 7 8 9 10 11 $zip = new ZipArchive;//新建一个ZipArchive的对象 /* 通过ZipArchive的对象处理zip文件 $zip->open这个方法的参数表示处理的

PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载

PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 http://my.oschina.net/junn/blog/104464 PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP 扩展已经开启,具体开启方法就不说了,不同的平台开启PHP扩增的方法网上都有,如有疑问欢迎交流.这里整理一下常用的示例供参考. 一.解压缩zip文件 ? 1 2 3 4 5 6 7 8 9 10 11 $zip = new ZipAr