Загрузите zip-файл с помощью DotNetZip на c # MVC5

#javascript #c# #ajax #asp.net-mvc #download

#javascript #c# #ajax #asp.net-mvc #Скачать

Вопрос:

Сценарий:

  1. фильтруйте данные jquery в соответствии с нашими потребностями.
  2. используйте кнопку загрузки, присутствующую помимо выпадающего списка длины страницы (это простая кнопка, а не кнопка отправки). чтобы загрузить изображения для отфильтрованных данных.
  3. получите идентификаторы записей из таблицы, создайте ее массив и отправьте его контроллеру.
  4. В контроллере извлеките пути к файлам из базы данных, связанные с идентификаторами записей, отправленными из запроса ajax.
  5. получите файлы, создайте zip-файл и отправьте его обратно (в ответ) для просмотра (загрузки).

как я уже упоминал сценарий, я хочу, чтобы zip-файл был загружен на компьютер. Но файл не загружается.

—————————Редактировать [решение]:—————————

Перепробовав множество решений, я наконец нашел решение.

Итак, сначала я использовал код контроллера как :

     [HttpPost]
        public ActionResult Ajax_DownloadImages(int[] records)
        {
             #region Variable Declaration
             
             List<tbl_image_Details> obj_records = new List<tbl_image_Details>();
             tbl_image_Details singleRecord = new tbl_image_Details();
             var memorystream = new MemoryStream();
             int temp = 0;
            
             #endregion
            
             using (Symphony_webServer_DBEntities db = new Symphony_webServer_DBEntities())
             {
            
                 #region Get File paths from the database.
                         for (int i = 0; i < records.Count(); i  )
                         {
                              temp = records[i];
                              singleRecord = db.tbl_image_Details.Where(x => x.record_id == temp).FirstOrDefault<tbl_image_Details>();
                              obj_records.Add(singleRecord);
                         }
                 #endregion
            
                  #region Zipping and sending the data to download.
                          using (ZipFile obj_Zip = new ZipFile())
                          {
                                obj_Zip.AlternateEncodingUsage = ZipOption.AsNecessary;
                                obj_Zip.AddDirectoryByName("Images");
                                foreach (var file in obj_records)
                                {
                                    obj_Zip.AddFile(file.image_path, "Images");
                                }
            
                                Response.ClearContent();
                                Response.ClearHeaders();
                                Response.AppendHeader("content-disposition", "attachment; filename=Myzip.zip");
            
                                obj_Zip.Save(memorystream);
                          }
                            memorystream.Position = 0;
                            return new FileStreamResult(memorystream, "application/octet-stream");
            
                  #endregion
            
    }
}
  

Представление:
Создайте простую кнопку и вызовите функцию загрузки при ее событии щелчка следующим образом.
Функция, которая запрашивает архивированные данные с сервера,-

Примечание: я использовал объект XMLHttpRequest для вызова запроса, потому что вызов jquery ajax неэффективен для обработки содержимого ответа blob.

 funtion DownloadImages(){
       // selecting the table
       var Displayedtable = $("#recordTable").DataTable();

       // fetching the rows of the table
       var datatable_rows = Displayedtable.rows().data().toArray();

       // creating an array to hold data.
       var table_data = new Array();
       
       // fetching data from each cell and putting it into the array.
       $.each(datatable_rows, function (index, value) {
                table_data.push(value['record_id']);
       });

       var records = JSON.stringify(table_data);
       var ajax = new XMLHttpRequest();
       ajax.open("Post", "/ReportsPage/Ajax_DownloadImages", true);
       ajax.setRequestHeader("Content-Type", "application/json");
       ajax.responseType = "blob";
       ajax.onreadystatechange = function () {
       if (this.readyState == 4) {
       
           var blob = new Blob([this.response], { type: "application/octet-stream" });
           console.log(this.response);
           alert(this.response);
           var fileName = "Myzip.zip";
           saveAs(blob, fileName);
        }
    };
        ajax.send(records);
}
  

Это определенно загрузит нужный zip-файл.

Комментарии:

1. Итак, что именно происходит не так? Неясно, есть ли у вас какие-либо ошибки или какое-то конкретное неожиданное поведение? И что же saveas() делать? Это может показаться важным в процессе загрузки, но вы этого не показали. Но также … почему бы просто не использовать обычную гиперссылку для загрузки файлов? Загрузка через AJAX — это боль в **, как вы только что обнаружили.

2. Или, на самом деле, зачем вообще использовать для этого какой-либо серверный код? Из вашего кода я вижу, что все данные, помещаемые в Zip-файл, создаются на стороне клиента, так почему бы просто не использовать клиентскую ZIP-библиотеку JavaScript (например, я полагаю, что JSZip популярен)? Тогда вам не понадобится AJAX или что-то еще.

3. Когда я использовал это решение, я не получаю ошибок, но файл не загружается.. Мне интересно, получает ли контроллер значение или not.it не останавливается на точке останова отладчика в контроллере

4. @ADyson потому что изображения находятся на сервере .. из этих изображений я хочу загрузить несколько из них, поэтому это на стороне сервера

5. О, хорошо, я понимаю, я не совсем понял этот бит. Я думал, вы просто добавляете строки из таблицы. Так что да, ок на стороне сервера необходимо. Но тогда остальные мои комментарии теперь актуальны. А что есть obj_records в C #? Похоже, он не определен.