问题描述
调用服务器接口,获取若干个文件的文件流。此时我想把多个文件流压缩成一个压缩包(.zip.7z)下载。请各位大神帮忙.如果使用ICSharpCode.SharpZipLib.dll不知是否能够做到.如果不使用第三方插件,是否能够做到?环境注意:没有服务器创建、删除文件的权限。所以我想到了用内存。不知道有没有大神做过这样的需求。在线等!
解决方案
解决方案二:
试试//zip文件输出流staticZipOutputStreamzos=null;//压缩附件publicstaticvoiddownloadAttach(stringfilePath,stringstrFileName,HttpResponseresponse){MemoryStreamms=null;response.ContentType="application/octet-stream";strFileName=HttpUtility.UrlEncode(strFileName).Replace('+','');response.AddHeader("Content-Disposition","attachment;filename="+strFileName+".zip");ms=newMemoryStream();zos=newZipOutputStream(ms);addZipEntry(filePath);zos.Finish();zos.Close();response.Clear();response.BinaryWrite(ms.ToArray());response.End();}//添加文件至压缩包privatestaticvoidaddZipEntry(stringPathStr){DirectoryInfodi=newDirectoryInfo(PathStr);foreach(DirectoryInfoitemindi.GetDirectories()){addZipEntry(item.FullName);}foreach(FileInfoitemindi.GetFiles()){FileStreamfs=File.OpenRead(item.FullName);byte[]buffer=newbyte[fs.Length];fs.Read(buffer,0,buffer.Length);stringstrEntryName=item.FullName.Replace(PathStr,"");ZipEntryentry=newZipEntry(strEntryName);zos.PutNextEntry(entry);zos.Write(buffer,0,buffer.Length);fs.Close();}}
解决方案三:
引用1楼andywangguanxi的回复:
试试//zip文件输出流staticZipOutputStreamzos=null;//压缩附件publicstaticvoiddownloadAttach(stringfilePath,stringstrFileName,HttpResponseresponse){MemoryStreamms=null;response.ContentType="application/octet-stream";strFileName=HttpUtility.UrlEncode(strFileName).Replace('+','');response.AddHeader("Content-Disposition","attachment;filename="+strFileName+".zip");ms=newMemoryStream();zos=newZipOutputStream(ms);addZipEntry(filePath);zos.Finish();zos.Close();response.Clear();response.BinaryWrite(ms.ToArray());response.End();}//添加文件至压缩包privatestaticvoidaddZipEntry(stringPathStr){DirectoryInfodi=newDirectoryInfo(PathStr);foreach(DirectoryInfoitemindi.GetDirectories()){addZipEntry(item.FullName);}foreach(FileInfoitemindi.GetFiles()){FileStreamfs=File.OpenRead(item.FullName);byte[]buffer=newbyte[fs.Length];fs.Read(buffer,0,buffer.Length);stringstrEntryName=item.FullName.Replace(PathStr,"");ZipEntryentry=newZipEntry(strEntryName);zos.PutNextEntry(entry);zos.Write(buffer,0,buffer.Length);fs.Close();}}
downloadAttach方法中的filePath参数是代表的什么?
解决方案四:
引用2楼z22708387的回复:
Quote: 引用1楼andywangguanxi的回复:
试试//zip文件输出流staticZipOutputStreamzos=null;//压缩附件publicstaticvoiddownloadAttach(stringfilePath,stringstrFileName,HttpResponseresponse){MemoryStreamms=null;response.ContentType="application/octet-stream";strFileName=HttpUtility.UrlEncode(strFileName).Replace('+','');response.AddHeader("Content-Disposition","attachment;filename="+strFileName+".zip");ms=newMemoryStream();zos=newZipOutputStream(ms);addZipEntry(filePath);zos.Finish();zos.Close();response.Clear();response.BinaryWrite(ms.ToArray());response.End();}//添加文件至压缩包privatestaticvoidaddZipEntry(stringPathStr){DirectoryInfodi=newDirectoryInfo(PathStr);foreach(DirectoryInfoitemindi.GetDirectories()){addZipEntry(item.FullName);}foreach(FileInfoitemindi.GetFiles()){FileStreamfs=File.OpenRead(item.FullName);byte[]buffer=newbyte[fs.Length];fs.Read(buffer,0,buffer.Length);stringstrEntryName=item.FullName.Replace(PathStr,"");ZipEntryentry=newZipEntry(strEntryName);zos.PutNextEntry(entry);zos.Write(buffer,0,buffer.Length);fs.Close();}}downloadAttach方法中的filePath参数是代表的什么?
这个方法是把filePaht路径下的所有文件打包成一个zip包。不知道你的文件流怎么来的,你可以对addZipEntry进行修改
解决方案五:
.NET4.5有System.IO.Compression.dll,在4.0里面也可以使用。using(MemoryStreamstream=newMemoryStream()){using(ZipArchivezip=newZipArchive(stream,ZipArchiveMode.Create,true)){zip.CreateEntry("filename").Open().Write(...);}returnstream;}这只是一个简单的例子,中间的Dispose/using自己处理。
解决方案六:
解决方案七:
直接用打包工具,做成一个exe,然后下载个文件就是了。我用是NSIS
解决方案八:
有没有找到解决方案,我也急需!文件都是通过web服务读取,跟应用程序不在一个服务器上。通过web服务读取后如何打包下载
解决方案九:
上面几位都是通过读取文件路径的方式打包
解决方案十:
C#下载带进度条代码(普通进度条)
解决方案十一:
引用3楼andywangguanxi的回复:
Quote: 引用2楼z22708387的回复:
Quote: 引用1楼andywangguanxi的回复:
试试//zip文件输出流staticZipOutputStreamzos=null;//压缩附件publicstaticvoiddownloadAttach(stringfilePath,stringstrFileName,HttpResponseresponse){MemoryStreamms=null;response.ContentType="application/octet-stream";strFileName=HttpUtility.UrlEncode(strFileName).Replace('+','');response.AddHeader("Content-Disposition","attachment;filename="+strFileName+".zip");ms=newMemoryStream();zos=newZipOutputStream(ms);addZipEntry(filePath);zos.Finish();zos.Close();response.Clear();response.BinaryWrite(ms.ToArray());response.End();}//添加文件至压缩包privatestaticvoidaddZipEntry(stringPathStr){DirectoryInfodi=newDirectoryInfo(PathStr);foreach(DirectoryInfoitemindi.GetDirectories()){addZipEntry(item.FullName);}foreach(FileInfoitemindi.GetFiles()){FileStreamfs=File.OpenRead(item.FullName);byte[]buffer=newbyte[fs.Length];fs.Read(buffer,0,buffer.Length);stringstrEntryName=item.FullName.Replace(PathStr,"");ZipEntryentry=newZipEntry(strEntryName);zos.PutNextEntry(entry);zos.Write(buffer,0,buffer.Length);fs.Close();}}downloadAttach方法中的filePath参数是代表的什么?
这个方法是把filePaht路径下的所有文件打包成一个zip包。不知道你的文件流怎么来的,你可以对addZipEntry进行修改
能不能指定打包该目录下的几个文件。并不一定要整个文件夹里所有的文件。