开发者

How to view a file after uploading it to App_Data/Uploads in MVC 3 with Razor?

开发者 https://www.devze.com 2023-04-02 04:02 出处:网络
I am new to mvc and I am stuck with a problem. I searched all over for an answer and I couldn\'t find one, but I am ve开发者_C百科ry sure that something skipped me. The problem is that I don\'t know h

I am new to mvc and I am stuck with a problem. I searched all over for an answer and I couldn't find one, but I am ve开发者_C百科ry sure that something skipped me. The problem is that I don't know how to acces a file after I upload it to App_Data folder. I use the same code that I found on all forums:

For my view I use this

@using (Html.BeginForm("Index", "Home", FormMethod.Post, 
new { enctype="multipart/form-data" }))
{
<input type="file" name="file" />
<input type="submit" value="submit" />
}

For my controller I use this

public class HomeController : Controller
{
// This action renders the form
public ActionResult Index()
{
    return View();
}

// This action handles the form POST and the upload
[HttpPost]
public ActionResult Index(HttpPostedFileBase file)
{
    // Verify that the user selected a file
    if (file != null && file.ContentLength > 0) 
    {
        // extract only the fielname
        var fileName = Path.GetFileName(file.FileName);
        // store the file inside ~/App_Data/uploads folder
        var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
        file.SaveAs(path);
    }
    // redirect back to the index action to show the form once again
    return RedirectToAction("Index");        
  }
} 

My model is

public class FileDescription
{
    public int FileDescriptionId { get; set; }
    public string Name { get; set; }
    public string WebPath { get; set; }
    public long Size { get; set; }
    public DateTime DateCreated { get; set; }
}

The thing is I want to upload a file to the database, and then the WebPath to be the link to my file. I hope I made myself clear enough. Any help would really be appreciated. Thanks


You can access your file server-side (so to access its contents from ASP.NET application) - just use Server.MapPath("~/App_Data/uploads/<yourFileName>") to get the absolute path (eg. C:/inetpub/wwwroot/MyApp/Add_Data/MyFile.txt).

Contents of App_Data folder are not directly accessible by URL for security reasons. All configs, databases are stored there so it's rather obvious why. If you need your uploaded file to be accessible via URL - upload it to some other folder.

I guess you need that file to be accessible via web. In such case the easiest solution would be to keep a filename (or full absolute path as mentioned at the beginning) to your file in a database and create a controller action that would take a filename and return the contents of your file.


In case it helps anyone, here's a simple example for a PDF:

public ActionResult DownloadPDF(string fileName)
{
    string path = Server.MapPath(String.Format("~/App_Data/uploads/{0}",fileName));
    if (System.IO.File.Exists(path))
    {
        return File(path, "application/pdf");
    }
    return HttpNotFound();
}


You should use a Generic handler to access the files. IMO storing the images / files in the App_Data folder is best practice, as it is not serving the files by default.

Of course it depends on your needs. If you don't care at all about who can access the images, then just upload them to a folder outside of the app_data folder :)

It all depends on your needs.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号