SujataJK Ответов: 2

Как загрузить несколько файлов и создать zip-файл из этих файлов в ASP.NET с#


Привет,
Я хочу загрузить несколько файлов из папки приложения и создать zip-файл.
Для этого я использовал контрольный список, чтобы показать список файлов, которые есть в этой папке .Так что можно скачать только выбранные файлы и создать zip-файл для того же самого.
следующий код я уже пробовал..

Что я уже пробовал:

Код в загрузке страницы для создания списка флажков выглядит следующим образом
if (!IsPostBack)
            {
                //DirectoryInfo dir = new DirectoryInfo(Server.MapPath(@"D:/PDFFiles/"));
                DirectoryInfo dir = new DirectoryInfo(@"D:/PDFFiles/");

                FileInfo[] files = dir.GetFiles();

                foreach (FileInfo file in files)
                {
                    string fileName = Path.GetFileName(file.ToString());
                    ListItem item = new ListItem(fileName);
                    cblFiles.Items.Add(item);
                }
                Response.Write("<script LANGUAGE='JavaScript' >alert('" + files.Length + " Files found')</script>");
            }



код на кнопке загрузки нажмите

protected void Button1_Click(object sender, EventArgs e)
        {
            if (cblFiles.SelectedItem == null)
            {
                // No options selected!
                Response.Write("<script LANGUAGE='JavaScript' >alert('You must select one or more files to download.')</script>");
                //base.DisplayAlert("You must select one or more files to download.");
                return;
            }
           
            var downloadFileName = string.Format("YourDownload-{0}.zip", DateTime.Now.ToString("yyyy-MM-dd-HH_mm_ss"));
            Response.ContentType = "application/zip";
            Response.AddHeader("Content-Disposition", "filename=" + downloadFileName);
     

        // Zip the contents of the selected files
        using (ZipFile zip = new ZipFile())
        {
            // Add the password protection, if specified
            if (!string.IsNullOrEmpty(txtZIPPassword.Text))
            {
                zip.Password = txtZIPPassword.Text;
                zip.Encryption = EncryptionAlgorithm.WinZipAes128;
            }      
            var readMeMessage = string.Format("Your ZIP file {0} contains the following files:{1}{1}", downloadFileName, Environment.NewLine);


            // Add the checked files to the ZIP
            foreach (ListItem li in cblFiles.Items)
                if (li.Selected)
                {
                    // Record the file that was included in readMeMessage
                    readMeMessage += string.Concat("\t* ", li.Text, Environment.NewLine);

                    // Now add the file to the ZIP (use a value of "" as the second parameter to put the files in the "root" folder)
                    zip.AddFile(li.Value, "Your Files");
                }
          
                    // Add the README.txt file to the ZIP
            zip.AddEntry("README.txt", readMeMessage, Encoding.ASCII);


            // Send the contents of the ZIP back to the output stream
            //zip.Save(downloadFileName);
            zip.Save(Response.OutputStream);
            Response.Close();
        }
        }


но не работает для меня когда я нажимаю на кнопку dowload нажмите на нее показывает исключение как
Исключение filenotfoundexception в
C:\\Program Files\\Common Files\\Microsoft Shared\\DevServer\\10.0\\BLWRM0032016-17.pdf":null}


Пожалуйста дайте Ми решение
спасибо

2 Ответов

Рейтинг:
2

Lay_Kay

Привет, Картик!

На меня это не действует. Я получаю это сообщение об ошибке привязки данных, когда пробовал ваш код. Не могли бы вы мне помочь? Смотрите мой код ниже.

Привязка Данных: 'Системы.Веб.Пользовательского интерфейса.WebControls.ListItem' не содержит свойства с таким именем....


protected void Page_Load(object sender, EventArgs e) 
{

  if (!IsPostBack)
  {

    string[] filePaths = Directory.GetFiles(Server.MapPath("../Files/"));
    List<listitem> files = new List<listitem>(); 


    foreach (string filePath in filePaths)
    {
        files.Add(new ListItem(Path.GetFileName(filePath), filePath));
        // string fileName = Path.GetFileName(files.ToString());

     }

      FileGrid.DataSource = files;
      FileGrid.DataBind(); // this line is giving me the problem.
  }

}


Jochen Arndt

Пожалуйста, не размещайте вопросы в качестве решений других вопросов. Используйте комментарии, чтобы ответить на решения или опубликовать новый вопрос (что было бы лучшим выбором здесь, потому что ваша ошибка исходит из кода, который не существует в ответе Karthik).

Однако, listitem != ListItem

Рейтинг:
1

Karthik_Mahalingam

Вы не добавляете File path к ListItem и пытается получить путь от Value собственность,

попробуйте добавить path к элементу списка чекбоксов Value услугам

foreach (FileInfo file in files)
                {
                    string fileName = Path.GetFileName(file.ToString());
                    ListItem item = new ListItem(fileName,file.FullName); // set the path in value property 
                    cblFiles.Items.Add(item);
                }


Поскольку путь не указан, он будет смотреть в расположение машины по умолчанию, и, конечно же, файл там отсутствует, что приводит к тому, что Исключение filenotfoundexception


SujataJK

Спасибо @Картик
но итерации по каждому элементу такой
DirectoryInfo dir = новый DirectoryInfo(@"D:/PDFFiles/");

FileInfo[] files = реж.Заражен();

foreach (FileInfo file in files)
{
строка fileName = Path.GetFileName(file.Метод toString());
Элемент ListItem = новый элемент ListItem(имя файла);
cblFiles.Предметы.Добавить элемент);
}

Здесь files-это массив типа FileInfo [], и я добавил файлы каталогов к файлам .Так что у меня есть путь на

Karthik_Mahalingam

он будет иметь только имя файла, а не полный путь.

SujataJK

да, да, вы правы.Я проверю ваше вышеприведенное решение

Karthik_Mahalingam

ладно, ладно.

SujataJK

я пытался, но у меня ничего не вышло
при печати файла.Полное имя в выглядит так
D:SujataWebApplicationZipFileDemoZipFileDemoDownloadLibraryPBLWRM0000116-17.pdf
вместо
D:\Sujata\WebApplication\ZipFileDemo\ZipFileDemo\DownloadLibrary\PBLWRM0000116-17.pdf

Karthik_Mahalingam

как же так ?
можете ли вы опубликовать скриншот?

SujataJK

я просто использую
ответ.писать("предупреждение('"+файл.Полное имя+"')")

Karthik_Mahalingam

держите точку останова и проверяйте

SujataJK

Эй, я решаю свою проблему просто немного изменив вышеприведенный код, то есть
Список<listitem элемент&ГТ; файлы = новый список<listitem элемент&ГТ;();
f (!это.IsPostBack)
{
string[] filePaths = каталог.GetFiles(Сервер.MapPath("~/Files/"));

по каждому элементу (строка FilePath в пути к каталогам)
{
файлы.Add(new ListItem(Path.GetFileName(filePath), filePath));
}
}

это работает для меня

Karthik_Mahalingam

круто, если работает, пожалуйста, закройте этот пост.