отправка файла из C # в angular1.6 - PullRequest
0 голосов
/ 05 ноября 2018

Мне нужно сгенерировать файл 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

Мне нужно немного сообразительности, чтобы понять, что я сделал неправильно, и исправить все.

спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...