如何使用带有web Api的byte []返回文件?

时间:2018-01-02 14:29:39

标签: c# arrays asp.net-web-api http-post zipfile

我尝试使用网络Api导出文件。

这是我的客户代码:

exportLicense(licenseIds) {
    return this.$http({
        method: 'POST',
        contentType: "application/zip",
        url: this.application.resolveWebApiService('Licenses', 'ExportLicenses'),
        data: licenseIds
    }); 
}

我的后端(mycontroller.cs)函数中的ExportLicenses方法,如下所示:

[HttpPost]
[Route("ExportLicenses")]
public async Task<IHttpActionResult> ExportLicenses([FromBody] int[] licenseIds)
{
    Contract.Requires(ModelState != null);

    if (!ModelState.IsValid)
    {
        return CustomReturnMessage(CustomHttpStatusCode.UnprocessableEntity, "Bad request", Request, ResponseMessage);
    }

    var task = exportLicensesTaskFactory(licenseIds);
    var taskResult = await task.TryRunAsync();
    if (!taskResult.Item1 || taskResult.Item2 == null)
    {
        return CustomReturnMessage(422, $"Failed to import license file:\n{task.Exception}", Request, ResponseMessage);
    }

    var response = Request.CreateResponse(HttpStatusCode.OK);
    response.Content = new ByteArrayContent(taskResult.Item2); //taskResult.Item2 is a byte[] 
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
    return ResponseMessage(response);

            //return Content(HttpStatusCode.OK, taskResult.Item2);
}

我不需要执行任何文件/ zip操作,因为我的任务已经执行此操作并且它向我返回一个byte []。(taskResult.Item2)

我的服务返回响应如下:(就像损坏的字符串一样)

res.data
"PK-    Њ"LH,����������4  ORDER_AVEA_0001_10042_PMEXCH003_20175211_License.xml  .            �UY��F}���0�W+�b`4w"�}��%b���ί�57�w�EQ�~�:�T�]�s>~]��eJa�5��W�������O�4F���*5e�'��ߗ>�����A�y~���E�?�*|����7������gۗ�>��ɧ������o����b�i[6k���3���b�4K�]'RÚ���˥��D�ٝ)J!g�������
�a�7+bx��w�6���q�+�L�}�G�̐2�4�$GZk�;hg[�t$�s�۵s��m���&I?-]8 E��+�B�,N�>��!��
`o
��~'�w�| ?�*�����}.<0�E߿����    �<�N����
����:�1}}A�Fh�z��a�
�����,@Q�k�?o����)u����l�e���g��Y�^��Ľ�\�tF�mK�-�lH2�MҞ)�m�s�r�*�����~��,���o���/��XD�Au�y6/�tS-Q�V��rA��_jg����7{��x,�{�虜��w���*D{�Ǖ0��u��*.奟��#<�ܑ��k�H�k"oi=����]�2��2�5���<v2_f=e)z�K4Ͽ(7O�ET�)x���^���Q�X���!R�䰯
-&S]v��������fl: ��9��V{sf�)�:Ĉ\e�Cjm�e��G[��z%��z�<wNƅ�M�'�a>��v�zR-ɛ���鱍T7(�37�r[�ɻ&��ڻ�E�L�ie�زO�da��쵸Q��    18#r��N[�Y�?�]j�0�Mk0^�ۏ؍?Fg^�.Xp|n�e��`����N:&M �Z+��o��6��~�
�wـw��4��   ��n�$��.��[)��Bb��8![*�L|���&Jf�Tc�u@?Ƃ���1�o��B�XW�[hFr.�]��y��+^���������U�d�T��9�]{��K���ẍ́���!Y������7�<Ώ���-F_��:u�f����Iasr~F�u�9�`�M�O���
�m�p��a���1T�&����y%3*��]H[G    �r�]u�nk^+'�y�#���8��T�x-G*p�\(}q��8.�b^�Aٟz�^�.��<��SO$d�tT"�r)8Щ�wB�;NB����<S-�[�EBVǽ�č�I��-�z-��0���k7y~J��/\g   ti�������z"x9L#P�_���S�ة6�z�T�X�N��_h�l�'��k�)I>]��W7�`fK�@~�/q�:���@���}�Ow�G��������PK3 -    Њ"LH,����������4                ORDER_AVEA_0001_10042_PMEXCH003_20175211_License.xml  .            PK      v   �    "

1 个答案:

答案 0 :(得分:0)

我们可以使用这样的东西:

postdownload: function (url, fileName, data) {
            authenticationService.getAuthenticationToken().then(function (token) {
                var form = document.createElement("form");
                form.setAttribute("method", "post");
                form.setAttribute("action", url);
                $('<input>').attr({ name: 'authToken', type: 'hidden' }).val('Bearer ' + token).appendTo(form);
                $('<input>').attr({ name: 'fileName', type: 'hidden' }).val(fileName).appendTo(form);
                $('<input>').attr({ name: 'data', type: 'hidden' }).val(data).appendTo(form);
                document.body.appendChild(form);
                form.submit();
                $('form > input[name=authToken]').val('');
                $('form > input[name=fileName]').val('');
                $('form > input[name=data]').val('');
            }, function (reason) {
                return $q.reject({
                    config: config,
                    headers: {},
                    status: 0,
                    data: null
                });
            });
        }

我们应该这样打电话:

var serialized = JSON.stringify(licenseIds);
        var url = this.application.resolveWebApiService('Licenses', 'ExportLicenses?' + idsString + '');
        this.uiHelper.postdownload(url, "asd.zip", serialized);

并编辑了我的后端代码:

var response = Request.CreateResponse(HttpStatusCode.OK);
            response.Content = new ByteArrayContent(taskResult.Item2);
            response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
            return ResponseMessage(response);