ASP.NET Minimal API 如何从 URL 返回/下载文件

10

我正在研究极简API,我的目标是当用户访问/download时,立即下载我的名为add.png的图片。

但无论我尝试什么,都无法实现,因为我要么得到一个只有{}的空页面。

这种方式是否可行?如果可以,应该怎么做?

这是我的尝试代码。(我已经获得了所有位置的权限,但仍然被拒绝访问!)

app.MapGet("/download", async () =>
  {
      var path = "add.png";
      using (var stream = new FileStream(path, FileMode.Open))
      {
          stream.CopyToAsync(stream);
      }
      var ext = Path.GetExtension(path).ToLowerInvariant();
      var result = (ext, Path.GetFileName(path));
      return result;
  });

我该如何在我的API中实现当用户使用/download时下载文件?
提前感谢。

不要将它存储在C盘,而是与您的应用程序一起存储?另外,为什么要复制到内存流中,而不是直接返回流? - Yuriy Faktorovich
那么你应该改变什么呢?@YuriyFaktorovich - Teun
我编辑了我的问题并附上了代码,但现在屏幕是空白的。@YuriyFaktorovich - Teun
你查看了网络选项卡吗?你得到了一个空的响应吗? - Yuriy Faktorovich
是的,我在我的问题中添加了一张图片,那就是我看到的。 - Teun
显示剩余2条评论
3个回答

23
您可以使用Results.File在您的 Minimal API 处理程序中返回要下载的文件:
app.MapGet("/download", () =>
{
    var mimeType = "image/png";
    var path = @"path_to_png.png";
    return Results.File(path, contentType: mimeType);
});

这对我不起作用...不确定为什么。var mimeType = "application/zip"; var path = @$"C:\logs{fileName}.zip"; return Results.File(path, contentType: mimeType); - Benjamin McGill
@BenjaminMcGill,“not working”并不是非常具有信息性的描述。 - Guru Stron
我在下面回答了它。但你说得对,“不工作”并不是很具描述性。在我的情况下,下载无法启动。我可以看到调用被发给了API,API响应了调试信息,但下载没有开始。 - Benjamin McGill

3

因为某些原因,被接受的答案对我没有起作用。也许是因为我正在下载一个zip文件...以下是最终适用于我的方法...

        app.MapGet("download/{fileName}", async (string fileName) => 
        {
            var mimeType = "application/zip";
            var path = @$"{fileName}.zip";
            
            var bytes = await File.ReadAllBytesAsync(path);

            return Results.File(bytes, mimeType, $"{fileName}.zip");

        })
            .Produces(StatusCodes.Status200OK)
            .Produces(StatusCodes.Status404NotFound)
            .WithName($"GET {EndpointCategory} by Name")
            .WithTags(Tag);

0

我尝试了3种不同的方法来使用asp.net core minimal api下载文件。有一件事我无法弄清楚的是,虽然(1)和(2)从根目录下载文件,但(3)却从wwwroot文件夹下载。如果有人能解决这个问题,那就太好了。

请查看项目文件夹结构图像 - 项目文件夹结构

app.MapGet("/showxwingdetails", () =>
    {
        // ( 1 )
        //byte[] barr =  File.ReadAllBytes("xwing.jpg");
        //return Results.File(barr, "image/jpg", "xwing.jpg");
    
        // ( 2 )
        //FileStream fs = File.OpenRead("xwing.jpg");   
        //return Results.File(fs, "image/jpg", "xwing.jpg");
    
        // ( 3 ) 
        // return Results.File("xwing.jpg", "image/jpg", "xwing.jpg");
    
    });

1
如果您有新的问题,请通过单击提问按钮来提出。如果它有助于提供上下文,请包含此问题的链接。- 来自审核 - Moritz Ringler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接