[英]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.