Я пытаюсь удаленно загрузить CSV-файл, вызвав службу WCF с помощью jQuery. Поскольку файл на самом деле не находится на сервере, я пытаюсь вернуть его как поток. Поскольку я использую заголовок Content-Disposition
, браузер клиента должен автоматически начать загрузку файла с заданным именем файла.Как загрузить файл из потока службы WCF?
Мой WCF метод сервиса в C#:
[OperationContract()]
public Stream GetCsvFile(int id)
{
string s = ...;
WebOperationContext.Current.OutgoingResponse.ContentType = "text/csv";
WebOperationContext.Current.OutgoingResponse.Headers["Content-Disposition"] = "attachment; filename=\"file1.csv\"";
return GenerateStreamFromString(s);
}
public Stream GenerateStreamFromString(string s)
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(s);
writer.Flush();
stream.Position = 0;
return stream;
}
Мой JQuery AJAX запрос:
$.ajax({
type: "POST",
url: serviceUrl,
cache: false,
data: data,
dataType: "text",
contentType: "application/json; charset=utf-8",
success: function() {
// TODO...
}
});
Этот запрос завершается успешно! И я могу видеть правильные данные CSV в ответе. Тем не менее, он не инициирует фактическое действие «загрузка файла» в браузере (сейчас тестирование на Chrome), а «file1.csv» не сохраняется на диске клиента.
В старой версии VB.NET одного и того же приложения, следующие работали в .aspx страницы с фоновым кодом:
Response.Clear()
Response.ContentType = "text/csv"
Response.AddHeader("content-disposition", "attachment; filename="file1.csv")
Response.Write(s)
Response.End()
Это автоматически инициирует загрузку файла из «file1.csv». Ни один диалог «Сохранить как» не будет отображаться, файл будет сразу загружен. Это было круто.
Так как же это не работает, когда я пытаюсь вызвать службу WCF с помощью jQuery?
ваш вызов ajax получит текстовый ответ. Он будет доступен только для JavaScript (он будет «разбираться» с помощью jQuery, он не сможет/не сможет его сохранить). См. [Этот пост здесь на SO] (http://stackoverflow.com/questions/365777/starting-file-download-with-javascript), чтобы узнать, как начать загрузку с JavaScript. –
Это был дан ответ http://stackoverflow.com/questions/6668776/download-file-through-an-ajax-call-php –