从asp.net中的文件夹中将多个图像保存到本地

时间:2011-08-14 14:59:48

标签: asp.net file save savefiledialog

我有一个文件下载问题你可以帮我吗......

这是代码:

    DirectoryInfo directoryInfo = new DirectoryInfo(Server.MapPath(@"/Bailiffs/BailiffFiles/"));
        string cukurNumber = string.Empty;
        if (txtCukurNumber.Text != string.Empty) {
            cukurNumber = txtCukurNumber.Text;
        }
        FileInfo[] fileInfoEnum = directoryInfo.GetFiles(cukurNumber + "*");
        Response.Clear();
        Response.AddHeader("Content-Disposition", "attachment;filename=" + txtCukurNumber.Text + ".zip");            
        Response.ContentType = "application/zip";
        using (ZipOutputStream zipStream = new ZipOutputStream(Response.OutputStream)) {
            zipStream.SetLevel(9);
            byte[] zipBuffer = new byte[4096];

            foreach (FileInfo fileInfo in fileInfoEnum) {
                string fileFullName = fileInfo.FullName;

                ZipEntry zipEntry = new ZipEntry(Path.GetFileName(fileFullName));

                zipEntry.DateTime = DateTime.Now;

                zipStream.PutNextEntry(zipEntry);

                using (FileStream fileStream = File.OpenRead(fileFullName)) {
                    int sourceBytes = 0;
                    do {
                        sourceBytes = fileStream.Read(zipBuffer, 0, zipBuffer.Length);
                        zipStream.Write(zipBuffer, 0, sourceBytes);
                    } while (sourceBytes > 0);


                }                    
            }
            zipStream.Finish();
            zipStream.Close();
            Response.Flush();
            Response.End();
        }

此代码必须通过过滤器获取所有图像文件并保存到磁盘但是保存浏览器的文件对话框只打开一次并且保存了一个奇怪的文件...我在哪里做错了...

感谢..

编辑:Bizzarre文件问题现已解决,主要问题是单个文件保存而不是多个.. 再次感谢...

1 个答案:

答案 0 :(得分:2)

虽然循环遍历目录中的每个文件,但是在循环的第一次迭代中执行Response.End()后,对用户的响应就完成了。他们只会得到枚举器找到的第一个文件。

浏览器没有按照您尝试的方式接收多个文件的概念。

您可以考虑收集各种图像文件并将它们放在一个ZIP文件中,然后将一个ZIP返回给用户。

以下是构建图像的ZIP(使用SharZipLib)并使用名为“images.zip”的单个文件进行回复的示例代码

包括SharpZipLib的这些using语句:

using ICSharpCode.SharpZipLib.Core;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Checksums;

然后在您想要流回ZIP文件的方法中:

DirectoryInfo directoryInfo = new DirectoryInfo(Server.MapPath(@"/Bailiffs/BailiffFiles/"));
string cukurNumber = string.Empty;
if (txtCukurNumber.Text != string.Empty) {
    cukurNumber = txtCukurNumber.Text;
}

IEnumerable<FileInfo> fileInfoEnum = directoryInfo.EnumerateFiles( cukurNumber + "*" );

    Response.Clear();

Response.AddHeader( "Content-Disposition", "attachment;filename=images.zip" );
Response.ContentType = "application/zip";

using( ZipOutputStream zipstream = new ZipOutputStream( Response.OutputStream ) ) {

    zipstream.SetLevel( 9 ); // 0-9, 9 being the highest compression

    byte[] buffer = new byte[4096];

    foreach( FileInfo fileInfo in fileInfoEnum ) {

        string file = fileInfo.FullName;

        ZipEntry entry = new
        ZipEntry( Path.GetFileName( file ) );

        entry.DateTime = DateTime.Now;
        zipstream.PutNextEntry( entry );

        using( FileStream fs = File.OpenRead( file ) ) {
            int sourceBytes;
            do {
                sourceBytes = fs.Read( buffer, 0, buffer.Length );
                zipstream.Write( buffer, 0, sourceBytes );
            } while( sourceBytes > 0 );
        }
    }

    zipstream.Finish();
    zipstream.Close();
}

Response.Flush();
Response.End();