#javascript #c# #ajax #asp.net-mvc #download
#javascript #c# #ajax #asp.net-mvc #Скачать
Вопрос:
Сценарий:
- фильтруйте данные jquery в соответствии с нашими потребностями.
- используйте кнопку загрузки, присутствующую помимо выпадающего списка длины страницы (это простая кнопка, а не кнопка отправки). чтобы загрузить изображения для отфильтрованных данных.
- получите идентификаторы записей из таблицы, создайте ее массив и отправьте его контроллеру.
- В контроллере извлеките пути к файлам из базы данных, связанные с идентификаторами записей, отправленными из запроса ajax.
- получите файлы, создайте 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 #? Похоже, он не определен.