powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / ZipArchive Неожиданный конец архива
4 сообщений из 4, страница 1 из 1
ZipArchive Неожиданный конец архива
    #39793770
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, хочу сделать скачивание ZIP- архива файлов из базы данных браузером.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
     /// <summary>
        /// Отправка файла клиенту
        /// </summary>
        /// <param name="id">Идентификатор файла</param>
        /// <returns></returns>
        public async Task<IActionResult> GetFile(Guid id)
        {
            var fileList = new List<( byte[] filebytes, string filename)>();
            try
            {
                using (SqlConnection con = new SqlConnection(dbConString))
                {
                    if (con.State != ConnectionState.Open)
                        await con.OpenAsync();                 
                        try
                        {
                            using (SqlCommand cmd = new SqlCommand("GetFile", con))
                            {
                              cmd.CommandType = CommandType.StoredProcedure;

                             SqlParameter masterId = cmd.Parameters.Add("@id", SqlDbType.UniqueIdentifier);
                             masterId.Value = id;
 
                            using (SqlDataReader reader =await cmd.ExecuteReaderAsync())
                            {
                                if (reader.HasRows)
                                {
                                    while (await reader.ReadAsync())
                                    {
                                        fileList.Add(((byte[])reader["File"], (string)reader["FileName"]));                               
                                    }
                                }
                                else
                                {
                                    throw new Exception();
                                }
                            }
                            }
                        }
                        catch (Exception ex)
                        {
                            return Json(new { success = false });
                        }                 
                }

            }
            catch (Exception)
            {
                throw;
            }

            if (fileList.Count>1)
            {
                //несколько файлов-упаковываем в архив

                using (var compressedFileStream = new MemoryStream())
                // using (FileStream compressedFileStream = new FileStream(@"C:\Users\antonov\Desktop\1\release.zip", FileMode.CreateNew))
                // через FileStream  файл сохраняется корректно


                //Create an archive and store the stream in memory.
                using (var zipArchive = new ZipArchive(compressedFileStream, ZipArchiveMode.Create, true))
                {
                    foreach (var (filebytes, filename) in fileList)
                    {
                        //Create a zip entry for each attachment
                        var zipEntry = zipArchive.CreateEntry(filename);

                        //Get the stream of the attachment
                        using (var originalFileStream = new MemoryStream(filebytes))
                        using (var zipEntryStream = zipEntry.Open())
                        {
                            //Copy the attachment stream to the zip entry stream
                            await originalFileStream.CopyToAsync(zipEntryStream);
                        }
                    }
                    return new FileContentResult(compressedFileStream.ToArray(), "application/zip") { FileDownloadName = "Files.zip" };
                    //пробовал  менять "application/zip" на "application/octet-stream"- не помогает
                }
            }
            else
            {
                var fl = fileList.FirstOrDefault();
                return File(fl.filebytes, "application/octet-stream", fl.filename);
            }
        }



на фронтэнде вызываю так:
Код: javascript
1.
2.
3.
4.
document.getElementById("GetFileButton").addEventListener('click', function (event) {
    let varid = $("#InputGuid").val();
    window.location = '/Uploader/GetFile?id=' + varid;
});



Архив скачивается, показывается правильное количество файлов, правильные имена файлов внутри архива. Но ошибка есть "Неожиданный конец архива", хотя на диск через FileStream сохраняется нормально.
Как можно исправить?
...
Рейтинг: 0 / 0
ZipArchive Неожиданный конец архива
    #39793772
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
  using (var zipArchive = new ZipArchive(compressedFileStream, ZipArchiveMode.Create, false))

тоже пробовал- не помогло.
...
Рейтинг: 0 / 0
ZipArchive Неожиданный конец архива
    #39794350
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
ZipArchive Неожиданный конец архива
    #39794422
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu,
спасибо помогло

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
       using (var compressedFileStream = new MemoryStream())
                {
                    using (var zipArchive = new ZipArchive(compressedFileStream, ZipArchiveMode.Create, true))
                    {                  
                        foreach (var (filebytes, filename) in fileList)
                        {
                            //Create a zip entry for each attachment
                            var zipEntry = zipArchive.CreateEntry(filename);

                            //Get the stream of the attachment
                            using (var originalFileStream = new MemoryStream(filebytes))
                            using (var zipEntryStream = zipEntry.Open())
                            {
                                //Copy the attachment stream to the zip entry stream
                                await originalFileStream.CopyToAsync(zipEntryStream);
                            }
                        }                      
                    }
                    return new FileContentResult(compressedFileStream.ToArray(), "application/zip") { FileDownloadName = "Files.zip" };
                }
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / ZipArchive Неожиданный конец архива
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]