gpt4 book ai didi

c# - 如何在 ASP.NET Core 3 中解析本地文件路径?

转载 作者:行者123 更新时间:2023-12-03 22:57:12 26 4
gpt4 key购买 nike

我正在使用 Visual Studio Code版本 1.42在我的 Ubuntu 18.04 .我刚刚安装成功sudo dotnet add package Google.Apis.Drive.v3通过终端,但我找不到安装 System.Web 的方法在我的 C#项目。
在做了一些研究之后,我发现了这个,它基本上解释了,我需要访问 IHostingEnvironment env object ,由 ASP.NET Core 负责处理。

问题我无法解析本地文件路径。我的意思是我不熟悉这种方法,想问一下,鉴于下面的代码,有人可以告诉我如何修改它以使用 IHostingEnvironment env object .

问题出现在包含以下内容的行中:

HttpContext.Current.Server.MapPath("~/GoogleDriveFiles")

这是其余的代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
//using System.Web;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;


namespace WebApi2.Models
{
public class GoogleDriveFilesRepository
{
//defined scope.
public static string[] Scopes = { DriveService.Scope.Drive };
// Operations....

//create Drive API service.
public static DriveService GetService()
{
//Operations....

public static List<GoogleDriveFiles> GetDriveFiles()
{
// Other operations....
}

//file Upload to the Google Drive.
public static void FileUpload(HttpPostedFileBase file) // <-- Error here
{
if (file != null && file.ContentLength > 0)
{
DriveService service = GetService();

string path = Path.Combine(HttpContext.Current.Server.MapPath("~/GoogleDriveFiles"), // <-- Error here
Path.GetFileName(file.FileName));
file.SaveAs(path);

var FileMetaData = new Google.Apis.Drive.v3.Data.File();
FileMetaData.Name = Path.GetFileName(file.FileName);
FileMetaData.MimeType = MimeMapping.GetMimeMapping(path); // <-- Error here

FilesResource.CreateMediaUpload request;

using (var stream = new System.IO.FileStream(path, System.IO.FileMode.Open))
{
request = service.Files.Create(FileMetaData, stream, FileMetaData.MimeType);
request.Fields = "id";
request.Upload();
}
}
}


//Download file from Google Drive by fileId.
public static string DownloadGoogleFile(string fileId)
{
DriveService service = GetService();

string FolderPath = System.Web.HttpContext.Current.Server.MapPath("/GoogleDriveFiles/"); // <-- Error here
FilesResource.GetRequest request = service.Files.Get(fileId);

string FileName = request.Execute().Name;
string FilePath = System.IO.Path.Combine(FolderPath, FileName);

MemoryStream stream1 = new MemoryStream();

request.MediaDownloader.ProgressChanged += (Google.Apis.Download.IDownloadProgress progress) =>
{
switch (progress.Status)
{
case DownloadStatus.Downloading:
{
Console.WriteLine(progress.BytesDownloaded);
break;
}
case DownloadStatus.Completed:
{
Console.WriteLine("Download complete.");
SaveStream(stream1, FilePath);
break;
}
case DownloadStatus.Failed:
{
Console.WriteLine("Download failed.");
break;
}
}
};
request.Download(stream1);
return FilePath;
}
}
}

到目前为止我做了什么:

1) 我经历了 this post作为基本解释,但这并没有解决我遇到的问题。

2) This post作为基本方法,在某种程度上也很有用。有用但仍然无法弄清楚我错过了什么。

3) 我更深入地研究了这个问题并到达了 here但仍然没有运气。

非常感谢您指出正确的方向。

最佳答案

你不需要System.Web或 HttpContext。您可以从 IHostingEnvironment.WebRootPath 读取 Web 应用程序的根路径在 ASP.NET Core 2.x 中,或 IWebHostEnvironment.WebPath在 ASP.NET Core 3.x 中。

依赖注入(inject)机制知道该接口(interface),这意味着您可以将其作为依赖项添加到您的 Controller 或服务中,例如:

public class MyController : Controller 
{
private IWebHostEnvironment _hostingEnvironment;

public MyController(IWebHostEnvironment environment) {
_hostingEnvironment = environment;
}

[HttpGet]
public IActionResult Get() {

var path = Path.Combine(_hostingEnvironment.WebRootPath, "GoogleDriveFiles");
...
}

您可以将根路径传递给类的构造函数。毕竟,一个名为 GoogleDriveFilesRepository 的类只关心它的本地文件夹,而不关心它是否托管在 Web 或控制台应用程序上。为此,方法不应该是静态的:
public class GoogleDriveFilesRepository 
{

public GoogleDriveFilesRepository (string rootPath)
{
_rootPath=rootPath;
}

public DriveService GetService()
{
//Operations....

public List<GoogleDriveFiles> GetDriveFiles()
{
// Other operations....
}

}

您可以在 Startup.cs 中将该类注册为服务:
public class Startup
{
private readonly IWebHostEnvironment _env;

public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Configuration = configuration;
_env = env;
}

public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services)
{
...
services.AddSignleton<GoogleDriveFilesRepository>(_ =>{
var gdriveRoot=Path.Combine(_env.WebRootPath,"GoogleDriveFiles");
return new GoogleDriveFilesRepository(gdrivePath);
});
...
}
}

此类现在可以用作对 Controller 的依赖项。不再需要使用 IWebHostEnvironment在 Controller 中:
public class MyController : Controller 
{
private GoogleDriveFilesRepository _gdrive;

public MyController(GoogleDriveFilesRepository gdrive) {
_gdrive=gdrive;
}
}

依赖注入(inject)的好处是,如果做得好,类本身不需要知道使用了 DI。 MyContainerGoogleDriveFilesRepository可以在单元测试中使用,而无需设置 DI:
[Fact]
public void Just_A_Test()
{
var repository=new GoogleDriveFilesRepository("sometestpath");
var myController=new MyController(repository);
myController.DoTheUpload(...);
}

关于c# - 如何在 ASP.NET Core 3 中解析本地文件路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60455519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com