#asp.net-core #asp.net-core-razor-pages
#asp.net-ядро #asp.net-core-razor-страницы
Вопрос:
Я разрабатываю образовательный сайт. Когда пользователь загружает учебный курс, я хочу, чтобы эта загрузка (учебный курс) выполнялась в форме сжатия (zipper), пожалуйста, дайте решение
Мой код:
public Tuple<byte[],string,string> DownloadFile(long episodeId)
{
var episode=_context.CourseEpisodes.Find(episodeId);
string filepath = Path.Combine(Directory.GetCurrentDirectory(),
"wwwroot/courseFiles",
episode.FileName);
string fileName = episode.FileName;
if(episode.IsFree)
{
byte[] file = System.IO.File.ReadAllBytes(filepath);
return Tuple.Create(file, "application/force-download",fileName);
}
if(_httpContextAccessor.HttpContext.User.Identity.IsAuthenticated)
{
if(IsuserIncorse(_httpContextAccessor.HttpContext.User.Identity.Name,
episode.CourseId))
{
byte[] file = System.IO.File.ReadAllBytes(filepath);
return Tuple.Create(file, "application/force-download", fileName);
}
}
return null;
}
Комментарии:
1. Вы не можете использовать оба ASP.NET Ядро и древний ASP.NET MVC 4. Что вы на самом деле используете?
2. Нет, я использую только ASP.NET Ядро и шаблон RazorPage
Ответ №1:
Я пишу демонстрационную версию, чтобы показать, как загрузить zip
файл из .net core:
Сначала добавьте пакет NuGet SharpZipLib
, создайте Image
папку wwwroot
и поместите в нее какую-нибудь картинку.
контроллер
public class HomeController : Controller
{
private IHostingEnvironment _IHosting;
public HomeController(IHostingEnvironment IHosting)
{
_IHosting = IHosting;
}
public IActionResult Index()
{
return View();
}
public FileResult DownLoadZip()
{
var webRoot = _IHosting.WebRootPath;
var fileName = "MyZip.zip";
var tempOutput = webRoot "/Images/" fileName;
using (ZipOutputStream IzipOutputStream = new ZipOutputStream(System.IO.File.Create(tempOutput)))
{
IzipOutputStream.SetLevel(9);
byte[] buffer = new byte[4096];
var imageList = new List<string>();
imageList.Add(webRoot "/Images/1202.png");
imageList.Add(webRoot "/Images/1data.png");
imageList.Add(webRoot "/Images/aaa.png");
for (int i = 0; i < imageList.Count; i )
{
ZipEntry entry = new ZipEntry(Path.GetFileName(imageList[i]));
entry.DateTime= DateTime.Now;
entry.IsUnicodeText = true;
IzipOutputStream.PutNextEntry(entry);
using (FileStream oFileStream = System.IO.File.OpenRead(imageList[i]))
{
int sourceBytes;
do
{
sourceBytes = oFileStream.Read(buffer, 0, buffer.Length);
IzipOutputStream.Write(buffer, 0, sourceBytes);
}while (sourceBytes > 0);
}
}
IzipOutputStream.Finish();
IzipOutputStream.Flush();
IzipOutputStream.Close();
}
byte[] finalResult = System.IO.File.ReadAllBytes(tempOutput);
if (System.IO.File.Exists(tempOutput)) {
System.IO.File.Delete(tempOutput);
}
if (finalResult == null || !finalResult.Any()) {
throw new Exception(String.Format("Nothing found"));
}
return File(finalResult, "application/zip", fileName);
}
}
когда я нажимаю downloadZip
, он загружает .zip
файл
Ответ №2:
Следующий простой пример иллюстрирует использование static ZipFile.CreateFromDirectory
метода, который, несмотря на то, что он находится в System.IO.Compression
пространстве имен, фактически находится в System.IO.Compression.FileSystem
сборке, поэтому вам нужно добавить ссылку на него в вашем контроллере.
[HttpPost]
public FileResult Download()
{
List<string> files = new List<string> { "filepath1", "filepath2" };
var archive = Server.MapPath("~/archive.zip");
var temp = Server.MapPath("~/temp");
// clear any existing archive
if (System.IO.File.Exists(archive))
{
System.IO.File.Delete(archive);
}
// empty the temp folder
Directory.EnumerateFiles(temp).ToList().ForEach(f => System.IO.File.Delete(f));
// copy the selected files to the temp folder
files.ForEach(f => System.IO.File.Copy(f, Path.Combine(temp, Path.GetFileName(f))));
// create a new archive
ZipFile.CreateFromDirectory(temp, archive);
return File(archive, "application/zip", "archive.zip");
}
Ответ из источника — MikesDotNetting