C# 在Web服务器和本地主机上保存和访问文件

C# 在Web服务器和本地主机上保存和访问文件,c#,file,asp.net-mvc-4,upload,appharbor,C#,File,Asp.net Mvc 4,Upload,Appharbor,我想从完全工作的fileupload控件在Web服务器上保存一个文件。我已收到HttpPostedFile file=HttpContext.Current.Request.Files[0]并且我想将其保存在我的服务器上 我的服务器名为“appharbor”(),它的规范是,我对Path.getTempPath()具有文件写入权限文件夹 我保存文件的代码是: HttpPostedFile file = HttpContext.Current.Request.Files[0]; string di

我想从完全工作的fileupload控件在Web服务器上保存一个文件。我已收到
HttpPostedFile file=HttpContext.Current.Request.Files[0]并且我想将其保存在我的服务器上

我的服务器名为“appharbor”(),它的规范是,我对
Path.getTempPath()具有文件写入权限文件夹

我保存文件的代码是:

HttpPostedFile file = HttpContext.Current.Request.Files[0];
string dirrectoryPath =Path.GetTempPath();
string fileName = Path.GetFileName(file.FileName);
string mapPath = HttpContext.Current.Server.MapPath(dirrectoryPath);
Directory.CreateDirectory(mapPath);
string fileFullPath = Path.Combine(mapPath, fileName);
file.SaveAs(fileFullPath);
myModel.uri = fileFullPath;
如何以有效的方式重新编写此代码

视图:

然后,服务器上发生的情况:

POST http://warsztatynet.apphb.com/api/upload 500 (Internal Server Error) 
GET http://c/Users/MyPath/sample.rtf 404 (Not Found)
这是在当地发生的

An exception of type 'System.Web.HttpException' occurred in System.Web.dll but was not handled in user code
Additional information: 'C:/Users/Tunczyk/AppData/Local/Temp/' expected virtual path.
我怀疑它们是完全一样的,因为它们都发生在同一个函数中

Path.GetTempPath()其在Web服务器和本地主机上的App_数据文件夹

当我有

string dirrectoryPath ="~/App_Data";
然后在服务器上发生:

POST http://warsztatynet.apphb.com/api/upload 500 (Internal Server Error) 
GET http://c/Users/MyPath/sample.rtf 404 (Not Found)
这在当地发生:

GET http://c/Users/MyPath/sample.rtf 404 (Not Found) 

编辑2 这是Caótico fanegas post的答案:

Not allowed to load local resource: file:///D:/Users/apphb5dac91d9317868/AppData/Local/Temp/glyphicons-halflings.png 
当我这样做时,会发生这样的情况:

string dirrectoryPath = Path.GetTempPath();
string fileName = Path.GetFileName(file.FileName);
Directory.CreateDirectory(dirrectoryPath);
string fileFullPath = Path.Combine(dirrectoryPath, fileName);
file.SaveAs(fileFullPath);
伙计们,我在寻找最简单的方法。它不是商业应用。这只是为了上大学


编辑3

为了更容易理解,我将为您提供我的申请链接: 要测试它,您必须:

  • 按课程创建选项卡
  • 按下按钮+
  • 按任意课程模式选择它
  • 按任意颜色的div
  • 从列表中选择文件类型
  • 上传文件
  • 应该会显示您的文件,但不会显示(主要是视图中单击的div)


    我建议使用Google Chrome,因为在其他浏览器中,您可能会遇到一些视觉问题。

    您必须将文件存储在提供的路径中的任何位置,然后使用FileResult操作结果使用操作检索该文件

    public FileResult file(string fileName)
    {
        return File(Path.Combine(Path.GetTempPath(), fileName), System.Net.Mime.MediaTypeNames.Application.Octet);
    }
    

    这不是完整的解决方案,但应该让您走上正确的道路。

    您必须将文件存储在提供的路径中的任何位置,然后使用FileResult操作结果使用操作检索该文件

    public FileResult file(string fileName)
    {
        return File(Path.Combine(Path.GetTempPath(), fileName), System.Net.Mime.MediaTypeNames.Application.Octet);
    }
    

    这不是完整的解决方案,但应该让您走上正确的道路。

    看起来像
    HttpPostedFile.SaveAs()
    需要一个虚拟路径来保存文件。如果您不通过
    Server.MapPath()
    将其转换为本地路径,那么
    “~/App\u data”
    方法应该可以工作

    如果您被强制保存到TempPath(例如,权限问题),我想您可以使用
    Stream.CopyTo()
    方法将文件保存在随机物理路径上

    using (var newFile = System.IO.File.Create("local_path"))
    {
        fil.InputStream.CopyTo(newFile);
    }
    

    这段代码直接来自我的头脑,因此,不是100%可靠。可能需要一些工作。

    看起来像是
    HttpPostedFile.SaveAs()
    需要一个虚拟路径来保存文件。如果您不通过
    Server.MapPath()
    将其转换为本地路径,那么
    “~/App\u data”
    方法应该可以工作

    如果您被强制保存到TempPath(例如,权限问题),我想您可以使用
    Stream.CopyTo()
    方法将文件保存在随机物理路径上

    using (var newFile = System.IO.File.Create("local_path"))
    {
        fil.InputStream.CopyTo(newFile);
    }
    

    这段代码直接来自我的头脑,因此,不是100%可靠。可能需要一些工作。

    此外,您可能需要编写一个自定义处理程序,该处理程序可以读取保存在临时文件夹中的文件,因为MVC不会从临时路径读取文件,除非它包含在您的路由中。更新了帖子,它现在包含信息“发生了什么”@ppittle。此外,您可能需要编写一个自定义处理程序来读取保存在临时文件夹中的文件,因为MVC不会从临时路径读取文件,除非它包含在您的路由中。更新了帖子,它现在包含了信息“发生了什么”@ppittle。您是否建议,不可能读取1。保存一个文件2。存储文件3的路径。在mvc4中,是否将路径用于任何目的?所以我必须使用FileResult来查看我的文件?我只需要存储在我的nice模型中的可访问文件路径。您需要一个单独的控制器,可以获取文件名。从您的观点来看,您将使用类似@Url.Action(“下载”、“文件”、Model.Uri”)的东西;是的,这是可能的,但我不推荐。访问文件的正确方法始终是通过操作。通过这种方式,您可以控制访问权限等。链接到静态路由对于公开可用的内容(如装饰、图像、css等)是可以的,而不是用户上传的内容。我强烈建议您使用动作/控制器来控制dowloads。您是否建议,1是不可能的。保存一个文件2。存储文件3的路径。在mvc4中,是否将路径用于任何目的?所以我必须使用FileResult来查看我的文件?我只需要存储在我的nice模型中的可访问文件路径。您需要一个单独的控制器,可以获取文件名。从您的观点来看,您将使用类似@Url.Action(“下载”、“文件”、Model.Uri”)的东西;是的,这是可能的,但我不推荐。访问文件的正确方法始终是通过操作。通过这种方式,您可以控制访问权限等。链接到静态路由对于公开可用的内容(如装饰、图像、css等)是可以的,而不是用户上传的内容。我强烈建议您对dowloads使用操作/控制器。如您所见,我已经用细节更新了问题,当我遵循您的建议时会发生什么。如您所见,我已经用细节更新了问题,当我遵循您的建议时会发生什么。