using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.IO;
using System.Web.Security;
using System.Text.RegularExpressions;
namespace Yavsc.Controllers
{
///
/// File system controller.
///
public class FileSystemController : Controller
{
private static string usersDir = "~/users";
///
/// Gets the users dir.
///
/// The users dir.
public static string UsersDir {
get {
return usersDir;
}
}
///
/// Index this instance.
///
[Authorize]
public ActionResult Index ()
{
string user = Membership.GetUser ().UserName;
ViewData ["UserName"] = user;
DirectoryInfo di = new DirectoryInfo (
Path.Combine (
Server.MapPath (UsersDir),
user));
if (!di.Exists)
di.Create ();
return View (new FileInfoCollection (di.GetFiles ()));
}
///
/// Details the specified id.
///
/// Identifier.
public ActionResult Details (string id)
{
foreach (char x in Path.GetInvalidPathChars()) {
if (id.Contains (x)) {
ViewData ["Message"] =
string.Format (
"Something went wrong following the following path : {0} (\"{1}\")",
id, x);
return RedirectToAction ("Index");
}
}
string fpath = Path.Combine (BaseDir, id);
ViewData ["Content"] = Url.Content (fpath);
FileInfo fi = new FileInfo (fpath);
return View (fi);
}
///
/// Create this instance.
///
public ActionResult Create ()
{
return View ();
}
///
/// Create the specified collection.
///
/// Collection.
[HttpPost]
[Authorize]
public ActionResult Create (FormCollection collection)
{
try {
string fnre = "[A-Za-z0-9~\\-.]+";
HttpFileCollectionBase hfc = Request.Files;
for (int i = 0; i < hfc.Count; i++) {
if (!Regex.Match (hfc [i].FileName, fnre).Success) {
ViewData ["Message"] += string.Format ("
File name '{0}' refused
", hfc [i].FileName);
ModelState.AddModelError (
"AFile",
string.Format (
"The file name {0} dosn't match an acceptable file name {1}",
hfc [i].FileName, fnre));
return View ();
}
}
for (int i = 0; i < hfc.Count; i++) {
// TODO Limit with hfc[h].ContentLength
string filename = Path.Combine (Server.MapPath (BaseDir), hfc [i].FileName);
hfc [i].SaveAs (filename);
ViewData ["Message"] += string.Format ("File name '{0}' saved
", hfc [i].FileName);
}
return RedirectToAction ("Index", "FileSystem");
} catch (Exception e) {
ViewData ["Message"] = "Exception:" + e.Message;
return View ();
}
}
///
/// Gets the base dir.
///
/// The base dir.
public static string BaseDir { get { return Path.Combine (UsersDir, Membership.GetUser ().UserName); } }
///
/// Edit the specified id.
///
/// Identifier.
public ActionResult Edit (int id)
{
return View ();
}
///
/// Edit the specified id and collection.
///
/// Identifier.
/// Collection.
[HttpPost]
public ActionResult Edit (int id, FormCollection collection)
{
try {
return RedirectToAction ("Index");
} catch {
return View ();
}
}
///
/// Delete the specified id.
///
/// Identifier.
public ActionResult Delete (int id)
{
return View ();
}
///
/// Delete the specified id and collection.
///
/// Identifier.
/// Collection.
[HttpPost]
public ActionResult Delete (int id, FormCollection collection)
{
try {
return RedirectToAction ("Index");
} catch {
return View ();
}
}
}
}