【问题标题】:Web Api return Image as HttpResponseMessage but .ajax call is not getting the downloadWeb Api 将图像作为 HttpResponseMessage 返回,但 .ajax 调用未获得下载
【发布时间】:2015-08-26 01:05:32
【问题描述】:

我正在尝试下载图片

客户端 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'); (根据我的 console.log 错误:

网页接口

签名

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);
}

【问题讨论】:

  • 您应该查看“数据库”吗?您是否能够调试并查看通过 FileStream 从路径读取图像时会发生什么?还有 mime 的价值是什么?
  • 嗯,我很确定这不是数据库问题,mime 是像 56874 这样的字节大小,它转换为大约前 3 个数字的 KB(我相信除以 1024)。它要么是 1. web api 如何处理文件并返回它......要么 2. 返回到 ajax 调用的方式
  • mime 应该代表服务器支持的有效媒体类型。例如新的 MediaTypeHeaderValue("图片/png");对于 png 格式的图像。我不确定你说的 "mime is the byte size like 56874" 是否正确。

标签: c# jquery ajax asp.net-web-api asp.net-web-api2


【解决方案1】:

在将 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);
    }
}

已编辑:实际上在阅读以下结果后,结果是有道理的。如果请求的 dataType 设置为期望 JSON,但返回了其他格式,则会发生错误事件。

Ajax request returns 200 OK, but an error event is fired instead of success

【讨论】:

  • 我仍在尝试使用 HttpResponseMessage ( public HttpResponseMessage DownloadFile(long id) ) 我正在阅读 IHttpActionResult 与 HttpResponseMessage 的区别,我将尝试切换到现在成功,但没有图像显示。
  • 努力让你的东西发挥作用。我确实返回了多种文件类型,但为了测试,如果只尝试 jpeg
  • Sweet,好的,现在这适用于 public IHttpActionResult DownloadFile(long id) 和 myBytes = File.ReadAllBytes(path);返回确定(myBytes);
猜你喜欢
  • 2015-02-21
  • 2013-02-23
  • 1970-01-01
  • 2017-07-02
  • 2013-01-29
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多