webapi返回文件流


完整代碼如下:

public class FileStreamResult : IHttpActionResult
{
    readonly Stream _stream;
    readonly string _mediaType;
    readonly string _fileName;

    public FileStreamResult(Stream stream, string mediaType) : this(stream, mediaType, null) { }

    public FileStreamResult(Stream stream, string mediaType, string fileName)
    {
        _stream = stream;
        _mediaType = mediaType;
        _fileName = fileName;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        return Task.FromResult<HttpResponseMessage>(Execute());
    }

    private HttpResponseMessage Execute()
    {
        HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK);
        try
        {
            httpResponseMessage.Content = new StreamContent(_stream);
            httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue(_mediaType);
            if (!string.IsNullOrEmpty(_fileName))
            {
                httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                {
                    FileName = HttpUtility.UrlEncode(_fileName, Encoding.UTF8),
                };
            }
            return httpResponseMessage;
        }
        catch
        {
            httpResponseMessage.Dispose();
            throw;
        }
    }
}

 

使用方法:

[HttpGet]
public IHttpActionResult Logo()
{
    var path = HostingEnvironment.MapPath("/files/logo.png");
    var f = new FileInfo(path);
    if (!f.Exists)
    {
        return new StatusCodeResult(HttpStatusCode.NotFound, this);
    }
    return new FileStreamResult(f.OpenRead(), "image/png");
}

[HttpGet]
public IHttpActionResult D()
{
    var path = HostingEnvironment.MapPath("/files/d.docx");
    var f = new FileInfo(path);
    if (!f.Exists)
    {
        return new StatusCodeResult(HttpStatusCode.NotFound, this);
    }
    return new FileStreamResult(f.OpenRead(), "application/octet-stream", "中文的jun2019.docx");
}

 

擴展方法:FileByteResult 

public class FileByteResult : FileStreamResult
{
    public FileByteResult(byte[] buffer, string mediaType) : base(new MemoryStream(buffer), mediaType) { }

    public FileByteResult(byte[] buffer, string mediaType, string fileName) : base(new MemoryStream(buffer), mediaType, fileName) { }
}

 

 

 

轉自:https://www.cnblogs.com/junio/p/10765632.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM