思路:
- 首先将视频文件和图片文件提出来
- 从方法获取传参的
jsondata
- 遍历
jsonData的资源的路径
- 创建Temp临时的文件夹,将视频文件和图片文件复制到临时的文件夹
- 复制资源路径到Temp的特定的文件夹(如
jsonData有video,那么就创建一个video文件夹,并且复制视频到这个Temp/Video的文件夹内)
- 将
dataJson写入到Temp临时文件夹
- 创建Zip文件夹,将Temp文件夹的内容复制到Zip文件夹中,然后删除Temp文件夹
- 创建Zip文件夹
- 拼凑压缩包完整目录
- 压缩指定文件到Zip的目录内(也就是将temp的文件,添加到Zip文件内,并且形成压缩包)
- 取zip内容 然后返回字节流,删除Temp临时文件夹
实现:
- 接口实现类的方法
public async Task<byte[]> GenerateZipFileAsync(ProgramJson jsonData, string id, string rootPath)
{
var pathList = jsonData.ProgramRes.AllResources;
var resList = new List<string>();
foreach (string resStr in pathList)
{
string modifiedStr = Path.Combine(Directory.GetCurrentDirectory(), resStr.Substring(1).Replace("/", "\\"));
resList.Add(modifiedStr);
}
string tempFilePath = Path.Combine(rootPath + "\\Upload\\Temp");
Directory.CreateDirectory(tempFilePath);
var source = new List<string>() { "Video", "Picture", "Audio", "Document" };
foreach (string sourceStr in source)
{
var matchingFiles = resList.Where(r => r.Contains(sourceStr)).ToList();
foreach (string matchingFile in matchingFiles)
{
string targetDirectory = Path.Combine(tempFilePath, "Downloads", "Upload", sourceStr);
Directory.CreateDirectory(targetDirectory);
string fileName = Path.GetFileName(matchingFile);
File.Copy(Path.Combine(rootPath, "Upload", sourceStr, fileName), Path.Combine(targetDirectory, fileName), true);
}
}
string jsonDataPath = Path.Combine(tempFilePath, "data.json");
string jsonDataString = "[" + System.Text.Json.JsonSerializer.Serialize(jsonData) + "]";
await File.WriteAllTextAsync(jsonDataPath, jsonDataString);
Directory.CreateDirectory(rootPath + "\\Upload\\Zip");
string zipFileName = $"{jsonData.ProgramName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.zip";
string zipFilePath = Path.Combine(rootPath + "\\Upload\\Zip", zipFileName);
ZipFile.CreateFromDirectory(tempFilePath, zipFilePath);
byte[] zipFileBytes = await File.ReadAllBytesAsync(zipFilePath);
Directory.Delete(tempFilePath, true);
return zipFileBytes;
}
- 控制器的实现
[HttpPost]
public async Task<IActionResult> ExportProgram(GenerateDto dto)
{
ProgramJson data = await _programBusiness.GenerateJsonAsync(dto);
string wwwrootPaths = _webHostEnvironment.WebRootPath;
if (data == null)
{
throw new BusException("Invalid data or topic");
}
var zipFileBytes = await _fileBusiness.GenerateZipFileAsync(data, dto.Id, wwwrootPaths);
var memoryStream = new MemoryStream(zipFileBytes);
memoryStream.Position = 0;
string programFileName = $"{data.ProgramName}.zip";
return File(memoryStream, "application/zip", programFileName);
}
- 下面是生成的目录(Temp文件夹已经删除)
