В моем приложении ASP.NET Core форма отправляется на контроллер и выполняет несколько этапов обработки, кульминацией которых является создание одного или многих различных физических файлов на сервере (отлично работает), а затем создание ZIP-файла с конкретным именем, содержащего эти файлы (работает нормально). Затем я хочу вернуть объект, содержащий несколько бит информации: количество обработанных объектов, общий статус завершения, путь к архиву для загрузки.
Я могу передать свой объект обратно и получить всю эту информацию.
Возвращаемый объект:
Код: Выделить всё
public class UpdateResultsVM
{
public int ClaimUpdateReturn {get; set; }
public string ClaimUpdateMsg {get; set; }
public string ZipFile {get; set; } // full physical path to archive
public bool Completed {get; set; }
public string Message {get; set; }
}
Код: Выделить всё
$.ajax({
type: "POST",
url: "/Work/PerformProcess",
data: { IDs: IDs, LetterID: LetterID },
dataType: "json",
success: function (result) {
d.resolve(result);
if (result.ClaimUpdateReturn === 0) {
console.log("returned 0");
// error handling
}
else if (result.ClaimUpdateReturn === 1) {
//console.log("returned 1");
if (result.Completed === true && result.ZipFile !== null) {
//console.log("got something to download: " + result.ZipFile);
var zipfilepath = result.ZipFile;
var zipfilename = zipfilepath.split('\\').pop().split('/').pop();
console.log("path " + zipfilepath + " name " + zipfilename);
var a = document.createElement('a');
document.body.appendChild(a);
a.style= "display: none";
a.href = zipfilepath;
a.download = zipfilename;
a.click();
document.body.removeChild(a);
console.log("done with download");
}
}
else {
//console.log("else statement");
// do some other stuff
}
},
error: function (response) {
alert("There was an error in updating " " + response.Message);
d.resolve(response);
}
});
Код: Выделить всё
// modify to return in-memory binary data of zip instead?
public string CreateZipFile(string destinationDirectory, string tagName, List Documents)
{
string FileName;
try
{
string filePath = Path.Combine(destinationDirectory, "TempOutput");
System.IO.Directory.CreateDirectory(filePath);
string zipName = filePath + "\\" + (String.IsNullOrEmpty(tagName) ? "Zip_" : tagName + "_") + DateTimeOffset.Now.ToString("yyyyMMddHHmmssffff") + ".zip";
using (ZipArchive zip = ZipFile.Open(zipName, ZipArchiveMode.Create))
foreach (string document in Documents)
{
zip.CreateEntryFromFile(document, Path.GetFileName(document));
// these need to remain as physical files, they
// are used elsewhere in the app.
}
FileName = zipName;
}
catch (Exception ex)
{
// stuff
}
return FileName;
}
Создание физического файла на сервере на самом деле не оптимально, поскольку тогда мне придется выполнить некоторую очистку, чтобы удалить эти файлы с уникальными именами. Поэтому я подумываю вместо этого перейти к созданию этого архивного файла в памяти.
Мне относительно ясно, как я могу изменить контроллер для создания zip-файла в памяти, хотя вводные данные определенно приветствуются. Я думаю, что, возможно, мне захочется добавить в UpdateResultsVM фактическое двоичное содержимое zip-файла и загрузить его, сохранив переданную строку ZipFile, чтобы присвоить ему имя для загрузки. Пробовал несколько вещей, и я не могу заставить это работать. Я хочу вернуть всю эту информацию И сгенерированное имя файла для загрузки.
Какой тип мне следует использовать для захвата zip-файла в памяти и что мне нужно сделать в моем JavaScript, чтобы успешно загрузить этот zip-файл?
Подробнее здесь: https://stackoverflow.com/questions/744 ... ipt-client
Мобильная версия