C# 如何使用ASP.NET核心下载png文件
我需要用户能够从我的网站下载png图像。当mthod运行时,它会无错误地完成,但不会下载图像。我不需要用户看到一个弹出对话框,认为它肯定是有帮助的。这就是我现在拥有的: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)
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;
}