当前位置: 首页 > 知识库问答 >
问题:

使用mvc web api提供文件

彭霄
2023-03-14

我想使用 MVC Web Api 提供文件。这是我的控制器

public HttpResponseMessage GetSupplierExcel(string supplierName)
{
    var filePath = GetFileName(supplierName);

    var stream = new FileStream(filePath, FileMode.Open);
    var result = new HttpResponseMessage();

    result.Content = new StreamContent(stream);
    result.Content.Headers.ContentType =
        new MediaTypeHeaderValue("application/octet-stream");
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
    result.Content.Headers.ContentLength = stream.Length;
    result.Content.Headers.ContentDisposition.FileName = fileName;

    return result;
}

此操作的响应是

StatusCode: 200, ReasonPhrase:'OK', Version: 1.1, Content:System.Net.Http.StreamContent, Headers:{Content-Type: apps/ocet-stream Content-Distion:附件;文件名=abc.xlsxContent-Llong: 7934}

并且没有正在下载的文件。

我也无法使用 HttpClient 从我的客户端下载流。没有流,只有响应字符串。

共有2个答案

王才英
2023-03-14

对不起,错误信息,我没有正确注意到您的api问题,并假设您正在尝试从mvc操作返回数据。我已经根据你的问题修改了我的答案。请检查下面的代码;

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    public HttpResponseMessage Get(int id)
    {
        WebClient webClient = new WebClient();
        byte[] pdfContent = webClient.DownloadData("http://www.bodossaki.gr/userfiles/file/dummy.pdf");
        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        string fileName = Path.GetFileName("http://www.bodossaki.gr/userfiles/file/dummy.pdf");

        result.Content = new ByteArrayContent(pdfContent);
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        result.Content.Headers.ContentDisposition.FileName = fileName;
        return result;
    }

    // POST api/values
    public void Post([FromBody]string value)
    {
    }

    // PUT api/values/5
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/values/5
    public void Delete(int id)
    {
    }
}
申嘉慕
2023-03-14

尝试使用返回文件()

例:

public async Task<ActionResult> GetImage(Guid id, string random = null)
    {
        string serviceBaseUrl = Utils.GetServiceBaseUrl();
        Uri url = new Uri(string.Format("{0}{1}?id={2}", serviceBaseUrl, "api/Image", id));

        HttpResponseMessage response = await JET.Utilities.Http.SendGetAsync(url);

        if (response.IsSuccessStatusCode)
        {
            ImageResponseModel imageResponse = JsonConvert.DeserializeObject<ImageResponseModel>(await response.Content.ReadAsStringAsync());
            System.Drawing.Image displayImage = null;

            using (System.IO.MemoryStream stream = new System.IO.MemoryStream(imageResponse.Single.Content))
            {
                displayImage = System.Drawing.Image.FromStream(stream);
            }

            byte[] imageBytes = ImageToByte(displayImage);

            return File(imageBytes, string.Format("image/{0}", "Png"));
        }

        return RedirectToAction("Index", "Home");
    }
 类似资料:
  • 问题内容: 我正在尝试使用Echo提供多个文件,但并非每次都可以。api代码如下所示: 确切地说,它确实适用于最初的文件获取,但是随后对于任何后续调用(无论是文件获取还是更多的“经典”调用)都会失败。对于每个浏览器,错误消息都有所不同: 在Chrome中: 语法错误:无法在’XMLHttpRequest’上执行’setRequestHeader’:’Bearer {the_entire_conte

  • 问题内容: 我正在用Spring开发一个网站,并试图提供不是.jsp文件(例如.html)的资源。 现在我已经注释掉了我的servlet配置的这一部分 并尝试从控制器返回资源的完整路径。 该文件夹中存在index.html文件。 注意:当我将index.html更改为index.jsp时,我的服务器现在可以正确服务该页面。 谢谢。 问题答案: 最初的问题是配置中指定了一个属性,因此实现类将添加到从

  • 我正在使用Spring开发一个网站,并尝试提供不是. jsp文件(例如. html)的资源 现在我已经注释掉了servlet配置的这一部分 并尝试从控制器返回资源的完整路径。 索引。该文件夹中存在html文件。 注意:当我更改索引时。要索引的html。jsp my server现在可以正确地为页面提供服务。 谢谢你。

  • 我想发布一个使用jitpack开发的android库。但我想在不发布源代码的情况下完成它。我不希望jitpack构建它,我将构建的输出(AAR文件)上传到github,我希望Jitpak只提供这些文件。 https://jitpack.io/docs/PRIVATE/#artifact-sharing 中的说明不适用,因为 UI 不再具有允许共享项目的设置选项卡。 还有,有没有更好的办法呢? 任何

  • 问题内容: 我正在尝试使用嵌入式Jetty构建一个简单的演示应用程序,该应用程序可以从“ html”目录提供静态文件,该目录是当前工作目录的子目录。这个想法是,带有演示jar和内容的目录可以移动到新位置,并且仍然可以使用。 我已经尝试了以下方法的变体,但是我不断得到404。 更新: 这是Jetty教程中记录的解决方案。如正确答案中所述,它使用而不是: 问题答案: 使用代替。

  • 问题内容: 我有一个具有以下结构的Web应用程序: 我已经设法使用nginx和wsgi运行Web应用程序,但是问题是没有提供静态文件,我的意思是,当我转到它们的URL时,服务器找不到它们。它给我404。 这是我的nginx配置文件部分: 缺少什么吗? 问题答案: 将此添加到你的nginx配置 用你应用的绝对路径替换时,你应该注意它不包含静态目录,并且其中的所有内容都将存储在中。