如何在不使用复制到 memory2 的情况下返回导出路径? [关闭]

Posted

技术标签:

【中文标题】如何在不使用复制到 memory2 的情况下返回导出路径? [关闭]【英文标题】:How to return export path without using copy to memory2? [closed] 【发布时间】:2021-11-04 19:03:51 【问题描述】:

我正在使用 web API asp.net core 3.1 我需要直接返回导出路径而不复制到内存

那么请问该怎么做呢?

如何返回导出路径而不复制到内存如下

return File(memory2, "text/plain", Path.GetFileName(exportPath));

意思是使用导出路径而不是使用内存2

在文件导出路径上获得结果后我需要的另一个含义

直接返回,不复制到内存

我尝试过的:

public IActionResult Upload()
    
foreach (var m in mods)
                      
                          List<InputExcel> inputmodulelist = new List<InputExcel>();
                          inputmodulelist = inputexcellist.Where(x => x.ModuleName == m).ToList();
                          var dtimport = DatatableConversion.ToDataTable(inputmodulelist);
                          DataTable dtexport = new DataTable();
                          dtexport = _deliveryService.LoadExcelToDataTable(_connectionString, dtimport);
                          ex.Export(dtexport, m, exportPath);
            
                      
                  
                  var memory2 = new MemoryStream();
                  using (var stream = new FileStream(exportPath, FileMode.Open))
                  
                      stream.CopyTo(memory2);
                  
                  memory2.Position = 0;
            
                  return File(memory2, "text/plain", Path.GetFileName(exportPath));

【问题讨论】:

A "return File()" 响应从服务器返回 THREE 个内容到您的浏览器:1)文件内容(文件中的字节),2)文件的MIME 类型(例如“text/plain”),3)文件路径(例如,您的浏览器可以将文件的内容写入磁盘)。问:你不喜欢这三件事中的哪一件,并想改变?它现在的工作方式到底有什么问题请澄清。 我需要返回文件才能在客户端下载它 您是否尝试过任何其他重载? docs.microsoft.com/en-us/dotnet/api/… 那么你为什么需要“MemoryStream”呢?只需返回一个 ContentResult():Create text file and download without saving on server in ASP.net Core MVC 2.1 为什么要将文件复制到内存中?为什么不直接将FileStream 提供给File 方法? 【参考方案1】:

从你的描述看来,你是想下载文件而不将文件内容读入内存,对吧?

如果是这样,你可以直接通过System.IO.File.ReadAllBytes()方法读取文件,代码如下:

[Route("api/[controller]")]
[ApiController]
public class ToDoController : ControllerBase

    private readonly ApplicationDbContext _dbContext;
    private readonly IWebHostEnvironment environment;
    public ToDoController(ApplicationDbContext context, IWebHostEnvironment hostEnvironment)
    
        _dbContext = context;
        environment = hostEnvironment;
     
    [HttpGet("download")]
    public IActionResult Download()
    
        var exportPath = Path.Combine( environment.WebRootPath, "files","Image1.jpg");
        return File(System.IO.File.ReadAllBytes(exportPath), "image/png", System.IO.Path.GetFileName(exportPath));
    

调用上述动作方法时,会下载图片文件。您可以更改file's MIME type 以下载不同的文件。

【讨论】:

以上是关于如何在不使用复制到 memory2 的情况下返回导出路径? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在不复制对象的情况下向 Python 公开返回 C++ 对象的函数?

如何在不复制数组的情况下返回 Javascript 中的数组减去单个项目? [复制]

如何在不重新绑定 this 的情况下返回一个带有粗箭头函数的对象? [复制]

如何在不使用“+”运算符的情况下添加两个变量? [复制]

如何在不连接 Powershell 的情况下传递参数? [复制]

如何在不复制 C# 的情况下将结构数组元素提取到变量中?