Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用ASP.NET核心下载png文件_C#_.net_Asp.net Mvc_Asp.net Core 2.0 - Fatal编程技术网

C# 如何使用ASP.NET核心下载png文件

C# 如何使用ASP.NET核心下载png文件,c#,.net,asp.net-mvc,asp.net-core-2.0,C#,.net,Asp.net Mvc,Asp.net Core 2.0,我需要用户能够从我的网站下载png图像。当mthod运行时,它会无错误地完成,但不会下载图像。我不需要用户看到一个弹出对话框,认为它肯定是有帮助的。这就是我现在拥有的: public async Task<IActionResult> DownloadImage(string filename) { var path = Path.GetFullPath("./wwwroot/images/school-assets/" + filename)

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

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");
        }
编辑:
如果我在success部分看到console.log文件,我会看到一个字节字符串,因此我知道它正在创建文件,但不允许用户访问i。我已经尝试了内容处理,并按照建议创建了一个物理文件结果。

您需要设置内容处理类型,以便能够直接下载文件:

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
注入构造函数。

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

试试像这样的东西

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));
}
公共异步任务下载映像(字符串文件名)
{
var path=path.GetFullPath(“./wwwroot/images/school assets/”+文件名);
MemoryStream memory=新的MemoryStream();
使用(FileStream-stream=newfilestream(路径,FileMode.Open))
{
等待流。CopyToAsync(内存);
}
记忆位置=0;
返回文件(内存,“image/png”,Path.GetFileName(Path));
}

@Caleb sir从下面的代码中可以下载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");
            }
有关更多信息,请参见此问题和答案。还有一个额外的链接

您可以使用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);
              }
        } 

此代码可以从服务器文件夹中的URL地址保存照片

private readonly Lazy<HttpClient> _client;
private readonly Lazy\u客户端;
在构造函数中:

_client = new Lazy<HttpClient>(() => clientFactory.CreateClient());
\u client=newlazy(()=>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;
        }
public异步任务SavePhotoInFolder(字符串url)
{
字符串photoPath=$“/Photos/{Guid.NewGuid()}.jpeg”;
使用(var request=newhttprequestmessage(HttpMethod.Get,url))
使用(
Stream contentStream=await(await _client.Value.sendsync(request)).Content.ReadAsStreamAsync(),
stream=newfilestream($“{u appEnvironment.WebRootPath}{photoPath}”,FileMode.Create))
{
等待contentStream.CopyToAsync(流);
}
返回光路;
}

您是如何请求下载图像的?没有图像是什么意思?我在视图中使用了ajax调用。当它运行时,我可以将结果打印到控制台并查看字节字符串,但没有弹出图像对话框来下载它。下面是ajax示例函数DownloadImage(文件名){$.ajax({url://MyHome/DownloadImage),键入:“Get”,数据:{filename:filename},成功:函数(文件){},错误:函数(请求,状态,错误){console.log(请求.响应文本);});}```@Caleb如果您想通过ajax下载文件,您需要实现click事件,请尝试参考,谢谢,我开始工作时会尝试一下。如果有效的话,我会给你答案
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;
        }