У меня есть следующее действие, которое возвращает PDF:
[HttpPost]
public string GetPDF(string data, float scaleFactor)
{
var result = JArray.Parse(data);
using (var fs = new FileStream(@"c:\pdf\pdftest.pdf", FileMode.Create))
{
MemoryStream ms = (MemoryStream)PdfMaker.CreatePDF(scaleFactor, result, dt);
ms.WriteTo(fs);
return Convert.ToBase64String(ms.ToArray());
}
}
(Игнорируйте FileStream, это только для тестирования)
Результатом является в основном сам PDF-файл, но он не загружается. Как мне загрузить выходной PDF-файл? Должен ли я вернуть что-нибудь еще? Я пробовал использовать FileResult, но в основном тот же сценарий.
Вот как я сейчас "читаю" файл через Ajax:
$.ajax({
type: "POST",
url: "home/GetPDF",
data: { data: JSON.stringify(data), scaleFactor: $("#sf").val() },
success: function (data) {
window.location = "data:application/pdf;base64, " + data;
}
});
Спасибо.
Редактировать:
Использовал решение в сообщении это, предоставленное Стивеном Мьюке.
почему бы просто не сделать window.location непосредственно для действия GetPDF и не вернуть FileResult с обычным файлом в нем? Загрузка файлов через ajax не работает, потому что данные попадают в память в объекте JS, а не на устройстве пользователя. Просто используйте обычный HTTP-запрос.
Файл создается на основе пользовательского ввода на странице, как я могу напрямую указать window.location для него, поскольку он имеет динамические параметры?
в этом случае используйте обратную передачу формы, чтобы вы могли легко отправить данные
Обратитесь к этот ответ для примера
@ADyson Мне нужно оставаться на странице.
Есть также способы создания PDF-файлов с использованием JavaScript без необходимости отправлять что-либо на сервер, если вы выполняете поиск в Интернете.
@ADyson Я должен генерировать PDF-файлы таким образом, он должен поступать с сервера.
Или другой вариант - отправить данные на сервер с помощью AJAX, сохранить файл во временной папке, вернуть идентификатор файла, затем выполнить window.open для второго действия с помощью GET и передать идентификатор файла, который будет выполнять скачать
"он должен поступать с сервера" ... вы только что сказали, что данные поступают от клиента. так кого волнует, генерирует ли его сервер или браузер? Результат тот же.
@ADyson PDF-файл должен быть создан на сервере, а не в данных от клиента. Нет возможности создавать PDF-файлы с использованием javascript с моими требованиями.
Вы совершенно четко сказали: «Файл создается на основе ввода данных пользователем на странице». Итак, данные есть на странице в браузере. Он уже находится на машине клиента. Итак, почему в этом сценарии PDF-файл должен создаваться сервером? Добавляет ли сервер дополнительные данные? Должна ли копия файла храниться на сервере? Вы не упомянули ни то, ни другое как требования. Если это не требования, то, если вы не можете указать другую причину, кроме тавтологического «он должен», то, насколько я могу судить, сервер не добавляет никакой ценности процессу.
Потому что это не имело отношения к проблеме. Я не создаю новый PDF напрямую, а редактирую существующий на сервере с вводом пользователя. Javascript не имеет доступа к подобным материалам.
ну что ж, вы не изложили ситуацию полностью, отсюда и мое недоразумение. Также ваш пример кода вызывает CreatePDF, так что простите меня за то, что я подумал, что вы создавали новый.
Потому что это не имеет отношения к моему вопросу. Мой вопрос в том, как скачать PDF-файл, а не сделать его.
@ADyson Не могли бы вы превратить часть временной папки в ответ? Это кажется возможным решением.
Да, но если загрузка неудобна, как в данном случае, то можно предложить альтернативный подход, основанный на доступной информации. В любом случае, попробуйте ссылку, опубликованную Стивеном, или мое предыдущее предложение отправить данные на сервер с помощью AJAX, сохранить файл во временной папке, вернуть идентификатор файла, затем выполнить window.open для второго действия с помощью GET и передача идентификатора файла, который будет выполнять загрузку. Я постараюсь изложить это как правдоподобный ответ.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Загрузка файлов через ajax не работает, потому что данные попадают в память в объекте JS, а не на устройстве пользователя. В конечном итоге вам нужно использовать обычный HTTP-запрос и вернуть FileResult.
Однако в вашем случае вам также необходимо сначала загрузить некоторые данные, которые необходимо добавить в PDF-файл перед его загрузкой. Это неудобно, потому что загрузка должна быть запросом GET, запускаемым в отдельном окне (потому что вам нужно, чтобы приложение оставалось на той же странице после этого), и предоставление этих данных в строке запроса вряд ли будет практичным.
Решение обойти это состоит в том, чтобы иметь двухэтапный процесс:
1) Из браузера загрузите свои данные через AJAX в метод действия «EditPDF». В методе действия отредактируйте PDF-файл, используя новые данные, и сохраните его. Затем верните клиенту какой-то уникальный идентификатор, который определяет правильный PDF-файл.
2) Когда браузер получает ответ от метода EditPDF, он захватывает возвращенный идентификатор и делает новый вызов window.open для URL-адреса действия «GetPDF». Это действие принимает идентификатор PDF в качестве параметра строки запроса, поэтому его легко включить в URL-адрес при выполнении запроса. Это действие находит правильный документ на сервере и возвращает его в FileResult. Браузер загрузит документ, не влияя на просматриваемую HTML-страницу.
Хорошее резюме ответа, связанного Стивеном. Спасибо.
Какой аякс? Покажи свой код.