我正在处理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 pattern
和UnitOfWork
。
我想要做的是在我的存储库中创建新方法。类似的东西:
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>
答案 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()并且魔术发生了。