如何从另一个项目传递HttpPostedFileBase文件作为方法的参数

时间:2013-12-11 17:54:31

标签: c# file asp.net-mvc-4

我正在处理ASP.NET MVC 4应用程序,并且有许多视图,用户可以上传我保存在服务器上的文件。除此之外,我还有一个单独的实体,它为上传的文件保存不同的数据,如:

  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 ); 

从我的控制器调用此方法,而不是同时写入相同的逻辑。

我的控制器中接受Action的标准HttpPostedFileBase file如下所示:

public ActionResult Edit(SomeViewModel model, HttpPostedFileBase uploadFile)

我想打电话给这个动作:

unitOfWork.SomeModelRepository.ManageFile(uploadFile);

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

在我的控制器Action中,我尝试将HttpPostedFileBase uploadFile解析为File uploadFile,但我不能这样做。但基本上我需要的是能够执行可以在文件上执行的相同操作 - 获取扩展名,获取名称等等......那么如何将HttpPostedFileBase uploadFile传递给我的DAL项目呢? / p>

1 个答案:

答案 0 :(得分:2)

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

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

public bool ManageFile(Stream file, string fileName) 
{

}  

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

也是为了它的价值,如果

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 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
    }
}

现在控制器对文件存储库一无所知。它只是调用SaveFile()并且魔术发生了。