#c# #angularjs #typescript
Вопрос:
У меня есть метод в серверной части C#, который извлекает XML-файл
string filePath = "c:\Users\" User.Identity.Name "\.SCADAPRO\WEBHMI\DASHBOARDS\" "Horizontal1.xml";
if (!System.IO.File.Exists(filePath))
{
Debug.WriteLine("No trend exists at the path: {0}", filePath);
return new HttpResponseMessage(HttpStatusCode.BadRequest);
}
else if (System.IO.File.Exists(filePath))
{
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
Byte[] bytes = System.IO.File.ReadAllBytes(filePath);
response.Content = new ByteArrayContent(bytes);
response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/xml");
response.Content.Headers.ContentDisposition.FileName = "trend";
return response;
}
else
{
return new HttpResponseMessage(HttpStatusCode.BadRequest);
}
В классе директивы AngularJS я вызываю метод из службы
public openExportTrendDialog(): void {
// Add download code here
var exportedXML = this.trendService.downloadActiveTrend();
exportedXML.then(function (result) {
console.log(result);
// Create the file
var file = new Blob([result.data], { type: 'text/xml' });
var fileURL = window.URL.createObjectURL(file);
// need to get actual file name for here
var fileName = "trend.xml";
var a = document.createElement("a");
document.body.appendChild(a)
a.href = fileURL;
a.download = fileName;
a.click();
})
};
Загрузка работает, однако единственным содержимым, которое появляется в файле, является » [объект объекта]».
Услуга приведена ниже. В конце концов в это будет передано имя файла, но сначала я хочу, чтобы загрузка работала правильно
public downloadActiveTrend() {
var urlPath = this.urlHelper.getPath(App.UrlHelper.Path.DownloadExportTrend);
console.log(urlPath);
var promise = this.$http({
method: 'POST',
url: urlPath,
responseType: 'arraybuffer'
})
promise.success(function (data) {
console.log(data);
return data;
}).error(function (data, status) {
console.log("Request failed with status: " status)
})
return promise;
}
Комментарии:
1. Какой стек вы используете? Веб-формы? MVC? Бритвенные страницы? Веб-API? Ты мог бы. использовали только
return File(filePath,"text/xml","trend.xml");
2.
downloadActiveTrend
файл тоже не возвращается. Ответ регистрируется, но никогда не проверяется и не возвращается3. Использование библиотеки классов net framework с интерфейсом angularjs
4. Это вообще ни о чем не говорит. ASP.NET Веб-формы? MVC? Бритвенные страницы? Все они работают на платформе .NET Framework. Начиная с MVC, самый простой способ вернуть файл-это записать
return File(...)
его в действие. В браузере вы должны фактически вернуть большой двоичный объект ответа. Прямо сейчас вы возвращаете результатconsole.log
5. В Javascript вы можете использовать fetch и Response.blob() во всех браузерах, нет необходимости во внешней библиотеке. Вам нужно будет проверить документы вашей библиотеки, чтобы узнать, как вы можете извлечь файл из
response