Создание ZIP-файла в памяти и возврат как часть класса клиенту JavaScript.C#

Место общения программистов C#
Ответить
Anonymous
 Создание ZIP-файла в памяти и возврат как часть класса клиенту JavaScript.

Сообщение Anonymous »

Я видел несколько статей, объясняющих, как создать ZIP-файл в памяти, а также как загрузить файл с помощью JavaScript. Ничто в точности не описывает то, что я пытаюсь сделать.
В моем приложении 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);

}
});
Функция контроллера для создания zip-файла следующая:

Код: Выделить всё

// 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-файла не находится в корне сети, поэтому при попытке загрузить его таким образом выдается ошибка. Я не могу поместить его в корневой каталог сети.
Создание физического файла на сервере на самом деле не оптимально, поскольку тогда мне придется выполнить некоторую очистку, чтобы удалить эти файлы с уникальными именами. Поэтому я подумываю вместо этого перейти к созданию этого архивного файла в памяти.
Мне относительно ясно, как я могу изменить контроллер для создания zip-файла в памяти, хотя вводные данные определенно приветствуются. Я думаю, что, возможно, мне захочется добавить в UpdateResultsVM фактическое двоичное содержимое zip-файла и загрузить его, сохранив переданную строку ZipFile, чтобы присвоить ему имя для загрузки. Пробовал несколько вещей, и я не могу заставить это работать. Я хочу вернуть всю эту информацию И сгенерированное имя файла для загрузки.
Какой тип мне следует использовать для захвата zip-файла в памяти и что мне нужно сделать в моем JavaScript, чтобы успешно загрузить этот zip-файл?

Подробнее здесь: https://stackoverflow.com/questions/744 ... ipt-client
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»