gpt4 book ai didi

c# - 如何将 HttpPostedFileBase 文件作为另一个项目的方法的参数传递

转载 作者:行者123 更新时间:2023-11-30 17:01:54 27 4
gpt4 key购买 nike

我正在开发一个 ASP.NET MVC 4 应用程序,在许多 View 中用户可以上传我保存在服务器上的文件。除此之外,我还有一个单独的实体,用于保存上传文件的不同数据,例如:

  string fileExtension = System.IO.Path.GetExtension(uploadFile.FileName);
string uniqueGuid = Helper.GetUniqueName(Server.MapPath("~/Content/Files"));
string newFileName = uniqueGuid + fileExtension;

这只是为了获得印象。我对从用户上传的每个文件执行许多操作,完成后我在数据库中使用信息创建新记录并将文件保存在服务器上。

我的解决方案有两个项目 - 一个是 MVC 4 应用程序,另一个用作数据访问层。在使用 Entity Framework 5 的地方,我实现了 Repository patternUnitOfWork

我想做的是在我的存储库中创建新方法。像这样的东西:

 public bool ManageFile(HttpPostedFileBase file ); 

并从我的 Controller 中调用此方法,而不是同时编写相同的逻辑。

我的 Controller 中接受HttpPostedFileBase 文件 的标准Action 如下所示:

public ActionResult Edit(SomeViewModel model, HttpPostedFileBase uploadFile)

在这个 Action 中我想调用:

unitOfWork.SomeModelRepository.ManageFile(uploadFile);

问题是我的数据访问层项目无法识别 HttpPostedFileBase。也许我可以添加一些对该项目的引用,我不确定,因为我在使用 Server.MapPath 时遇到了一些问题,例如在 Action 之外,但即使我可以引用它我仍然不确定它是否是更好的方法。毕竟我的数据访问层只是这个 - 一个抽象层我不认为 HttpPostedFileBase 在那里有一席之地。

在我的 Controller Action 中,我尝试将HttpPostedFileBase uploadFile 解析为File uploadFile,但我做不到。但基本上我需要的是能够执行与文件相同的操作 - 获取扩展名、获取名称等等...那么如何将 HttpPostedFileBase uploadFile 传递给我的 DAL 项目?

最佳答案

HttpPostedFileBase在 System.Web 程序集中,您可以从 DAL 项目中引用它。

另一种选择,如果你想将你的 ManageFile() 方法与 HttpPostedFileBase 分离,只需传入文件的 MemoryStream。以及任何其他必需的参数:

public bool ManageFile(Stream file, string fileName) 
{

}

我认为单元测试更容易,如果允许调用者提供路径信息,则可以使用不同的命名方案重用 ManageFile()。

也是为了它的值(value),如果

string uniqueGuid = Helper.GetUniqueName(Server.MapPath("~/Content/Files"));

只是根据现有文件生成一个唯一的Guid,你可以跳过这个逻辑。 Guid's will pretty much always be unique ,所以做 Guid.NewGuid() 就足够了。

public bool ManageFile(Stream file, string fileName) 
{
string extension = System.IO.Path.GetExtension(fileName);
string newFileName = Guid.NewGuid() + extension;
}

编辑添加:

以下是我在项目中构建此类内容的方式。我有一个 IFileRepository 接口(interface):

interface IFileRepository
{
SaveFile(Stream stream, string fileName);
}

然后我根据要保存文件的位置创建一个具体类型

public AzureFileRepository : IFileRepository
{
public void SaveFile(Stream stream, string fileName)
{
...
CloudBlob.UploadFromStream(stream);
...
}
}

public DiskFileRepository : IFileRepository
{
public void SaveFile(Stream stream, string fileName)
{
File file = // create a File() object and save the stream
}
}

现在 Controller 对文件存储库一无所知。它只是调用 SaveFile() 并且奇迹发生了。

关于c# - 如何将 HttpPostedFileBase 文件作为另一个项目的方法的参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20526463/

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