返回文件时发生InvalidOperationException

时间:2018-12-05 11:22:46

标签: c# asp.net asp.net-mvc asp.net-core .net-core

我尝试返回要下载的文件时遇到一些奇怪的问题, 这是我的代码

string filePath = Path.Combine(Path1, Path2, filename);
return File(filePath, "audio/mp3", "myfile.mp3");

但是有问题,它会返回此错误

InvalidOperationException:未配置文件提供程序来处理提供的文件。

我不确定我错过了什么,有什么帮助吗?

4 个答案:

答案 0 :(得分:2)

因此,返回File方法的方法如@SeM建议,但要从文件路径中删除文件名。

string filePath = Path.Combine(Path1, Path2);

IFileProvider provider = new PhysicalFileProvider(filePath);
IFileInfo fileInfo = provider.GetFileInfo(filename);
var readStream = fileInfo.CreateReadStream();

return File(readStream, "audio/mpeg", fileName);

答案 1 :(得分:0)

您首先需要创建文件提供商注册。

services.AddSingleton<IFileProvider>(  
       new PhysicalFileProvider(Directory.GetCurrentDirectory()));  

然后您可以像这样使用它

public class IndexModel : PageModel
{
    private readonly IFileProvider _fileProvider;

    public IndexModel(IFileProvider fileProvider)
    {
        _fileProvider = fileProvider;
    }

    public IFileInfo FileInfo { get; private set; }

    public void OnGet()
    {
        IFileInfo = _fileProvider.GetFileInfo("filename.ext");
    }
}   

在您的情况下,您的功能体会像

string filePath = Path.Combine(Path1, Path2, filename);
IFileInfo = _fileProvider.GetFileInfo(filepath);
var fs = fileInfo.CreateReadStream();
return File(fs, "audio/mp3", "myfile.mp3");

答案 2 :(得分:0)

在asp.net核心中,您需要PhysicalFileProvider才能访问物理文件系统:

string filePath = Path.Combine(Path1, Path2, filename);

IFileProvider provider = new PhysicalFileProvider(filePath);
IFileInfo fileInfo = provider.GetFileInfo(filename);
var readStream = fileInfo.CreateReadStream();

return File(readStream, "audio/mpeg", fileName);

据我所知,.mp3文件的哑剧类型为audio/mpeg

答案 3 :(得分:0)

您只需从以下位置更改代码即可

string filePath = Path.Combine(Path1, Path2, filename);
return File(filePath, "audio/mp3", "myfile.mp3");

对此:

string filePath = Path.Combine(Path1, Path2, filename);
return PhysicalFile(filePath, "audio/mp3", "myfile.mp3");

然后问题解决了!

您还可以将文件放在wwwroot文件夹(您的网络根目录文件夹)下。然后,您可以使用相对路径网络根目录文件夹,并将filePath放在File方法的第一个参数中。然后,您可以毫无问题地访问文件。这比使用PhysicalFile方法要安全得多。