Мне нужно сгенерировать файл docx, используя C # с информацией о клиенте. Это работает.
Теперь, когда я создал свой файл, я хочу отправить его клиенту Angular 1.6.
Я нашел этот пример: http://jaliyaudagedara.blogspot.com/2016/05/angularjs-download-files-by-sending.html
так что моя функция почти такая же:
public HttpResponseMessage DownloadSR(string fileName)
{ string filePath = Server.MapPath("~/" + fileName + ".docx");
using (MemoryStream ms = new MemoryStream())
{
using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
byte[] bytes = new byte[file.Length];
file.Read(bytes, 0, (int)file.Length);
ms.Write(bytes, 0, (int)file.Length);
HttpResponseMessage httpResponseMessage = new HttpResponseMessage();
httpResponseMessage.Content = new ByteArrayContent(bytes.ToArray());
httpResponseMessage.Content.Headers.Add("x-filename", fileName);
httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
httpResponseMessage.Content.Headers.ContentDisposition.FileName = filePath;
httpResponseMessage.StatusCode = HttpStatusCode.OK;
return httpResponseMessage;
}
}
}
часть JS отличается из-за части .success
:
$rootScope.DL = function (filename) {
var urlDlApi = jsHelper.getEnvBaseUrl() + 'DlApi/' + filename;
$http({
method: 'GET',
url: urlDlApi,
headers: {
'Content-Type': 'application/json; charset=utf-8'
},
responseType: 'arraybuffer',
}).then(
// Response from request
function (response) {
headers = response.headers();
if (true) {
var contentType = headers['content-type'];
var linkElement = document.createElement('a');
var blob = new Blob([response.data], { type: response.config.headers.Accept });
var url = window.URL.createObjectURL(blob);
linkElement.setAttribute('href', url);
linkElement.setAttribute("download", filename);
var clickEvent = new MouseEvent("click", {
"view": window,
"bubbles": true,
"cancelable": false
});
linkElement.dispatchEvent(clickEvent);
}
else {
$scope.showErrorMessage = true;
$rootScope.errorMessage = response.data.ErrorMessages;
}
$scope.isLoading = false;
},
// Eror from request
function (response) {
console.error("Erreur requete ", response);
$scope.showErrorMessage = true;
$scope.errorMessage = "error append, please contact site administrator";
$scope.isLoading = false;
}
);
}
при тестировании C # длина файла file.length составляет 84022 байта,
httpResponseMessage.Content содержит 84022 байта.
в части javascript, console.log из response
дает мне:
{data: ArrayBuffer, статус: 200, config: {…}, текст состояния: «OK», заголовки: ƒ,…}
конфиг
:
заголовки
:
{Accept: "application / json, text / plain, / "}
jsonpCallbackParam
:
"Перезвоните"
метод
:
"ПОЛУЧИТЬ"
paramSerializer
:
g ngParamSerializer (params)
responseType
:
"ArrayBuffer"
transformRequest
:
[Ƒ]
transformResponse
:
[Ƒ]
URL
:
"/ Магазин / загрузки / MyFile"
прото
:
объект
данные
:
ArrayBuffer
byteLength
:
269
прото
:
ArrayBuffer
заголовки
:
name (имя)
аргументы
:
[Исключение: TypeError: свойства caller, callee и arguments не могут быть доступны для функций строгого режима или объектов аргументов для вызова их в Function.remoteFunction (: 2: 14)]
гость
:
[Исключение: TypeError: свойства caller, callee и arguments не могут быть доступны для функций строгого режима или объектов аргументов для вызова их в Function.remoteFunction (: 2: 14)]
длина
:
1
название
:
«»
прототип
:
{конструктор: ƒ}
прото
:
ƒ ()
[[FunctionLocation]]
:
angular.js: 11376
[[Область]]
:
Области применения [3]
статус
:
200
его статус
:
"ХОРОШО"
xhrStatus
:
«Завершить»
прото
:
Объект
Интересно о длине данных: 269
он не содержит ни одного из 84022 байтов содержимого
на вкладке сети сказано, что размер этого GET составляет 700 байт
с помощью этой функции JS я получаю файл "myfile.txt". он содержит:
StatusCode: 200, ReasonPhrase: 'OK', Версия: 1.1, Содержимое:
System.Net.Http.ByteArrayContent, заголовки: {
x-filename: myfile
Тип содержимого: application / octet-stream
Содержание-Диспозиция: приложение;
имя файла = "C: \ Users \ tarsicius \ Downloads \ myfile.docx"
}
Таким образом, он содержит всю информацию httpResponseMessage, за исключением того, что содержимое заменяется только типом содержимого:
System.Net.Http.ByteArrayContent
Мне нужно немного сообразительности, чтобы понять, что я сделал неправильно, и исправить все.
спасибо