Web Api返回图像作为HttpResponseMessage,但.ajax调用没有得到下载

本文关键字:调用 ajax 下载 返回 Api 图像 HttpResponseMessage Web | 更新日期: 2023-09-27 18:09:45

我正在尝试下载图像

客户端HTML代码:

$.ajax({
            url: 'http://localhost:17308/api/DownloadFile/10272',
            type: 'GET',
            dataType: 'json',
            success: function (data, textStatus, xhr) {
                console.log(data);
            },
            error: function (xhr, textStatus, errorThrown) {
                console.log('Error in Database');
            }
        }); 

上面的代码可以很好地调用Web API,但是我遇到了错误-> console.log(' error in Database');(per my console.log on error:

)

Web Api

签名

public HttpResponseMessage DownloadFile(long id)
返回代码:

result = new HttpResponseMessage(HttpStatusCode.OK);
var stream = new FileStream(path, FileMode.Open);
result.Content = new StreamContent(stream);
result.Content.Headers.ContentType = new MediaTypeHeaderValue(mime);
return result;
  1. 我需要改变我的数据类型从json到别的东西(我假设是这样)
  2. 还有什么方法来解决这个问题?

我正在尝试这段代码返回一个jpeg,它使它成功,但从不显示图像。

HTML:

<button type="button" id="Download" class="btn btn-primary">Download</button>    
<img id="test" alt="test" src="" />
Javascript:

var request = function () {
            var ajaxOptions = {};
            ajaxOptions.cache = false;
            ajaxOptions.url = "/api/DownloadFile/10272";
            ajaxOptions.type = "GET";
            ajaxOptions.headers = {};
            ajaxOptions.headers.Accept = "application/octet-stream"
            ajaxOptions.success = function (result) {
                console.log("start");
                $("#test").attr("src", "data:image/jpg;base64," + result);
                console.log("end");
            };
            ajaxOptions.error = function (jqXHR) {
                console.log("found error");
                console.log(jqXHR);
            };
            $.ajax(ajaxOptions);
        }
        $(function () {
            $('#Download').on('click', request);
        })
更新2:

更改为以下代码,现在可以工作了

public IHttpActionResult DownloadFile(long id)
{
    //code
     myBytes = File.ReadAllBytes(path);
     return Ok(myBytes);
}

Web Api返回图像作为HttpResponseMessage,但.ajax调用没有得到下载

在我将Accept标头更改为"application/octet"并将数据类型留空之前,我遇到了同样的问题。被返回的jquery对象的状态为200,并返回数据,但总是执行错误选项。我以前看到过这种情况,jquery数据类型或Accept标头与Web API控制器返回的内容不匹配。错误响应中的jqXHR对象实际上显示了某些错误被触发,但我还没有发现是什么jquery选项或Web API响应导致了这种行为。

<button id="submit" class="btn btn-primary">submit</button> 
<img id="test" alt="test" src="" />
JavaScript

var request = function () {
var ajaxOptions = {};
ajaxOptions.cache = false;
ajaxOptions.url = "/api/question3api";
ajaxOptions.type = "GET";
ajaxOptions.headers = {};
ajaxOptions.headers.Accept = "application/octet-stream"
ajaxOptions.success = function (result) {
    console.log(result);
    $("#test").attr("src", "data:image/png;base64," + result);
};
ajaxOptions.error = function (jqXHR) {
    console.log("found error");
    console.log(jqXHR);
};
$.ajax(ajaxOptions);
}
$(function () {
 $('#submit').on('click', request);
})
Api控制器

public class question3apiController : ApiController
{
    public  IHttpActionResult GetFile()
    {
        string FilePath = HttpContext.Current.Server.MapPath("~/images/images.png");
        byte [] myBytes = File.ReadAllBytes(FilePath);
        return Ok(myBytes);
    }
}

编辑:实际上,阅读以下结果是有意义的。如果请求的数据类型设置为JSON,但返回了其他格式,则会发生错误事件。

Ajax请求返回200 OK,但触发错误事件而不是成功