сохранить несколько изображений в локальную папку из asp.net - PullRequest
0 голосов
/ 14 августа 2011

У меня проблема с загрузкой файлов, можете ли вы помочь мне в этом ...

вот код:

    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 Ответ

2 голосов
/ 14 августа 2011

Несмотря на то, что вы зацикливаетесь на каждом файле в каталоге, после выполнения Response.End () на первой итерации цикла ответ пользователю завершается. Они получат только первый файл, найденный перечислителем.

В браузере нет концепции получения нескольких файлов так, как вы пытаетесь.

Вы можете собирать различные файлы изображений и складывать их в ZIP-файл, а затем возвращать пользователю один ZIP-файл.

Вот пример кода, который создаст ZIP (используя SharZipLib) изображений и ответит одним файлом с именем "images.zip"

Включите их, используя операторы для SharpZipLib:

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();
...