使用breeze下载zip文件

时间:2014-09-05 12:13:29

标签: breeze asp.net-web-api binaryfiles

我的Webapi创建动态zip文件。我希望能够下载该文件。目前我正试图使用​​微风,但似乎不可能用它。

我做了一个简单的例子,它只是从我的硬盘上打开zip文件,然后我在webapi中返回二进制内容。

public HttpResponseMessage GetFile()
    {
        var path = @"C:\myFolder\ myfile.zip";
        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        var stream = new FileStream(path, FileMode.Open);
        result.Content = new StreamContent(stream);
        result.Content.Headers.ContentType =
            new MediaTypeHeaderValue("application/x-zip-compressed");
        result.Content.Headers.Add("content-disposition", "attachment; filename=sendMyFileToClient.zip");
        return result;
    }

然后在我的viewmodel中,我使用breeze在webapi中调用此方法

var query = EntityQuery.from("GetFile");
        manager.executeQuery(query).then(function () {
            alert("Downloaded file");
        }).fail(function () { alert("Not downloaded"); });

有人可以告诉我,如果我不能在微风中这样做,那么请告诉我是否可以使用ajax请求下载或其他方式?我在谷歌上找不到多少。

2 个答案:

答案 0 :(得分:0)

Breeze不知道如何处理二进制数据,所以它不会有太大帮助。并且您无法使用JavaScript下载和保存文件,因为浏览器的沙盒不允许JavaScript访问文件系统。

所以从根本上说,你需要将window.location设置为服务器文件/资源​​的URL,以便浏览器下载它并让用户保存它。要保留SPA的单个页面,请设置iframe的window.location而不是主窗口。

还需要考虑其他一些细微之处,特别是在错误处理方面。考虑使用jQuery File Download Plugin中提到的this SO answer之类的内容。

答案 1 :(得分:0)

我发现了这个问题,因为我也想1)从服务器下载文件,2)文件在服务器的内存中,3)我使用breeze。而且,我同意施密特先生的说法,微风不能做到。它似乎只能返回一个对象列表(记录) - 这对微风有意义......用于数据访问。

而且,和我一样,我想你想知道如何用下载文件而不用 breeze。除了微风之外,我不熟悉网络通讯。我想知道如何将文件下载到客户端,该客户端到目前为止通过微风和从目前只接受来自微风的查询的服务器访问数据。我不知道客户端和服务器是否被锁定为轻微访问。由于答案似乎并非如此,我觉得很天真。

如何为微风客户端/服务器下载文件的答案是:不要使用微风!在微风生态系统之外使用一些机制。我想对一个经验丰富的网络开发人员来说可能是显而易见的,但在我职业生涯的前25年里,我并没有对网络技术保持相当的了解。

我不知道这是否能回答你的问题。至少这可能对遇到这个问题的其他人有用。

至于你如何下载文件,我猜测有数以万计的SO问题,博客文章和相关文章。但是,我会分享我提出的解决方案...... FWIW。

服务器代码:

[HttpPost]
public HttpResponseMessage RelatedRegistrationsFromRegistration()
{
    var httpContent = new ByteArrayContent(...);
    httpContent.Headers.ContentType = new MediaTypeHeaderValue("Application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    httpContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
    {
        FileName = "Related Registrations.xlsx"
    };
    return new HttpResponseMessage(HttpStatusCode.OK) { Content = httpContent };
}

使用angular&#s; $ http通信服务的客户端代码:

this.downloadFromUrl = function (url, refs) {
    $http({
        method: 'POST',
        url: url,
        data: serializeData({ 'refs': refs }),
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
        },
        responseType: 'arraybuffer'
    }).success(function (data, status, headers) {
        var filename = headers('content-disposition').split('=')[1].replace(';', '');
        var blob = new Blob([data], { type: headers('content-type') });
        if (navigator.msSaveBlob) {
            navigator.msSaveBlob(blob, filename);
        } else {
            var link = document.createElement('a');
            link.href = URL.createObjectURL(blob);
            link.setAttribute('download', filename);
            link.click();
            link.remove();
        }
    }).error(function () {
        alert('Error');
    });
}