繁体   English   中英

如何使用 ASP.NET Core 下载 png 文件

[英]How to download a png file with ASP.NET Core

我需要用户能够从我的网站下载 png 图像。 当该方法运行时,它没有错误地完成,但没有下载图像。 我不需要用户看到弹出对话框,认为这肯定有帮助。 这就是我现在所拥有的:

public async Task<IActionResult> DownloadImage(string filename)
        {
            var path = Path.GetFullPath("./wwwroot/images/school-assets/" + filename);
           MemoryStream memory = new MemoryStream();
            using (FileStream stream = new FileStream(path, FileMode.Open))
            {
                await stream.CopyToAsync(memory);
            }
            memory.Position = 0;
            return File(memory, "image/png", "download");
        }

这个方法被视图中的ajax调用调用,看起来像这样


        $.ajax({
            url: "./MyHome/DownloadImage",
            type: "Get",
            data: {filename : filename},
            success: function (file) {
            },
            error: function (request, status, error) {
                console.log(request.responseText);
            }
        });
    }

编辑:如果我在成功部分的 console.log 文件中看到一串字节,所以我知道它正在创建文件但不让用户访问我。 我已经按照建议尝试了内容处理和创建物理文件结果。

对于File ,您需要提供带有文件扩展名的文件名,否则下载的文件将无法打开。

尝试类似的东西

public async Task<IActionResult> DownloadImage(string filename)
{
    var path = Path.GetFullPath("./wwwroot/images/school-assets/" + filename);
    MemoryStream memory = new MemoryStream();
    using (FileStream stream = new FileStream(path, FileMode.Open))
    {
        await stream.CopyToAsync(memory);
    }
    memory.Position = 0;
    return File(memory, "image/png", Path.GetFileName(path));
}

您需要设置内容配置类型以启用文件的直接下载:

public IActionResult OnGetPng()
{
    var bytes = System.IO.File.ReadAllBytes("test.png");

    var cd = new System.Net.Mime.ContentDisposition
    {
        FileName = "test.png",
        Inline = false
    };

    Response.Headers.Add("Content-Disposition", cd.ToString());
    Response.Headers.Add("X-Content-Type-Options", "nosniff");

    return File(bytes, "image/png");

}

如果您愿意,您还可以使用PhysicalFileResult类型,它负责处理您的流并从您的控制器返回 FileResult。 在这种情况下,您的代码如下所示:

   var fn = Path.Combine(env.WebRootPath, "test.png");

   var contentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");

   Response.Headers[HeaderNames.ContentDisposition] = contentDisposition.ToString();

   return new PhysicalFileResult(fn, "image/jpeg");

要访问WebRootPath您必须将IHostingEnvironment env注入到您的构造函数中。

@Caleb先生从下面的代码你可以下载png文件。

从文件夹下载png文件

[HttpGet]
        public FileStreamResult DownloadPngFile(string fileName)
        {            
            var stream = new FileStream(Directory.GetCurrentDirectory() + "\\wwwroot\\images\\school-assets\\" + fileName, FileMode.Open);
            return new FileStreamResult(stream, "image/png");
        }

从数据库下载png文件

   [HttpGet]
            public FileStreamResult DownloadPngFileFromDataBase(string id)
            {
                var _fileUpload = _db.ImageFileUpload.SingleOrDefault(aa => aa.fileid == id);         
                // _fileUpload.FileContent column type is byte
                MemoryStream ms = new MemoryStream(_fileUpload.FileContent);
                return new FileStreamResult(ms, "image/png");
            }

有关更多信息,请参阅此问答。 在 asp.net core 中下载 Pdf 文件(已接受的答案)和一个额外的链接在 asp.net core 中下载文件

此代码可以将来自 URL 地址的照片保存在服务器文件夹中。

private readonly Lazy<HttpClient> _client;

在构造函数中:

_client = new Lazy<HttpClient>(() => clientFactory.CreateClient());

最好以服务器不会花费额外资源来立即创建 HttpClient 的方式使用延迟加载。

public async Task<string> SavePhotoInFolder(string url)
        {
            string photoPath = $"/Photos/{Guid.NewGuid()}.jpeg";

            using (var request = new HttpRequestMessage(HttpMethod.Get, url))
            using (
                Stream contentStream = await (await _client.Value.SendAsync(request)).Content.ReadAsStreamAsync(),
                stream = new FileStream($"{_appEnvironment.WebRootPath}{photoPath}", FileMode.Create))
            {
                
                await contentStream.CopyToAsync(stream);
            }

            return photoPath;
        }

您可以使用 HttpClient

  using (var client = new HttpClient())
           {  
              try
              {
                using var result = await client.GetAsync($"http://{url}"); 
                if (result.IsSuccessStatusCode)
                {                        
                    return await result.Content.ReadAsByteArrayAsync();
                }

              }
             catch(Exception ex)
              {
                  Console.WriteLine(ex.InnerException);
              }
        } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM