【问题标题】:Download Excel from Asp.net Web API 2 using AngularJS使用 AngularJS 从 Asp.net Web API 2 下载 Excel
【发布时间】:2016-03-08 11:16:44
【问题描述】:

我环顾四周,似乎很多人都有同样的问题,正在下载的文件已损坏。我在前端使用 web api 2 和 angular。

服务器端

[Route("api/export/{id}")]
    public async Task<IHttpActionResult> GetFileAsync(Guid id)
    {         
        var originalFile = System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/template.xls");

        var stream = _exportService.Export(id, originalFile);

        return new FileActionResult(stream);
    }


public class FileActionResult : IHttpActionResult
{
    private Stream Data { get; }

    public FileActionResult(Stream data)
    {
        Data = data;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        HttpResponseMessage response = new HttpResponseMessage
        {
            Content = new StreamContent(Data)
        };
        //response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        //response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.ms-excel");
        //response.Content.Headers.ContentDisposition.FileName = "ExportedCOBie.xls";
        response.Content.Headers.ContentLength = Data.Length;

        return Task.FromResult(response);
    }
}

角度客户端

             function(Restangular, FileSaver, Blob) {

            this.exportToCobie = function(projectId) {
                toastr.info('Exporting data', 'Info');
                Restangular.one("export/" + projectId)
                    .get({ responseType: "arraybuffer" })
                    .then(function (data) {                        
                        var file = new Blob([data], { type: 'application/vnd.ms-excel' });
                        FileSaver.saveAs(file, 'export.xls');                
                 })
            }                
        }

任何帮助将不胜感激,谢谢。


public MemoryStream Export(Guid projectId, string file)
    {
        try
        {
            var fileStream = new FileStream(file, FileMode.Open);
            _workbook = new HSSFWorkbook(fileStream);
            fileStream.Close();

            var contacts = _uow.ContactRepository.FindAllBy(c => c.ProjectId == projectId);
            //var fileOutputStream = new FileStream(file, FileMode.Create);
            var memoryStream = new MemoryStream();
            _workbook.Write(memoryStream);
            memoryStream.Position = 0;
            return memoryStream;
        }
        catch (Exception exception)
        {
            _logger.Error(exception.Message);
        }
        return null;
    }

【问题讨论】:

  • 您下载的文件是否有内容,但只是损坏了,还是 0 字节?
  • @RonBrogan 它有内容但已损坏,奇怪的字符。
  • 你可以在这里发布发生了什么:_exportService.Export
  • @RonBrogan Export 只是创建电子表格的业务逻辑。我已经通过 MVC 控制器测试了 _exportService.Export 方法,它运行良好。
  • 在这种情况下,我能看到的唯一情况是,如果您的流在某些时候不在适当的位置,并且只有部分流到达您想要的位置。跨度>

标签: asp.net angularjs asp.net-web-api asp.net-web-api2


【解决方案1】:

如果其他人对 Restangular 做同样的事情,下面的代码就发挥了作用,希望对您有所帮助!

(function () {
    'use strict';
    angular
        .module('app.cobie.export')
        .service('CobieExportDataService', ['Restangular', 'FileSaver', 'Blob',
            function (Restangular, FileSaver, Blob) {

                this.exportToCobie = function (projectId) {
                    toastr.info('Exporting COBie data', 'Info');
                    return Restangular.withConfig(function(RestangularConfigurer) {
                        RestangularConfigurer.setDefaultHttpFields({
                            cache : false ,
                            responseType: "arraybuffer",    
                        });
                    }).one("export/" + projectId).get().then(function (res) {                        
                        var data = new Blob([res], { type: 'application/vnd.ms-excel' });
                        FileSaver.saveAs(data, 'export.xls');
                    })
                }

            }]);
})();

【讨论】:

    【解决方案2】:

    我在尝试下载 pdf 时遇到了同样的问题。我不记得到底是什么问题,但这是我的工作成功回调:

    function success(res) {
    
        var file = new Blob([res.data], { type: 'application/pdf' });
        var fileName = 'somefilename' + moment().format('YYYYMMDDTHHmm') + '.pdf';
    
        if ($window.navigator && $window.navigator.msSaveOrOpenBlob) {
            $window.navigator.msSaveOrOpenBlob(file, fileName);
        } else {
            var a = document.createElement('a');
            a.href = URL.createObjectURL(file);
            a.target = '_blank';
            a.download = fileName;
            document.body.appendChild(a);
            a.click();
        }
    }
    

    希望对你有帮助。

    【讨论】:

    • 不,输出仍然损坏
    猜你喜欢
    • 2014-07-27
    • 2021-02-13
    • 2018-06-11
    • 1970-01-01
    • 2018-02-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多