web-dev-qa-db-fra.com

ASP NET MVC 5 Supprimer le fichier du serveur

Voir le code:

@if (File.Exists(Server.MapPath("~/Images/Cakes/" + Html.DisplayFor(modelItem => Model.CakeImage))))
    {
        @model TastyCakes.Models.Cakes
        <form name="deletePhoto" action="/Cakes/DeletePhoto" method="post">
        @Html.AntiForgeryToken()
        File name of image to delete (without .jpg extension):
        <input name="photoFileName" type="text" value="@Html.DisplayFor(modelItem => Model.CakeImage)" />
        <input type="submit" value="Delete" class="tiny button">
        </form>
    } else {
        <p>*File Needs to be uploaded</p>
}

Code du contrôleur:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult DeletePhoto(string photoFileName)
{

    ViewBag.deleteSuccess = "false";
    var photoName = "";
        photoName = photoFileName;
    var fullPath = Server.MapPath("~/Images/Cakes/" + photoName);

        if (File.Exists(fullPath))
        {
            File.Delete(fullPath);
            ViewBag.deleteSuccess = "true";
        }
}

Où il est dit si (File.Exists) AND File.Delete, le code comporte des lignes ondulées en dessous. J'essaie donc de déterminer la syntaxe dont j'ai besoin pour que ce fichier soit supprimé.

Voici une capture d'écran de mon code dans le contrôleur: enter image description here

UPPDATE: Le code fonctionne et crée un exemple de code simple sur mon blog, expliquant comment je le fais fonctionner et comment l'idée est née http://httpjunkie.com/2014/724/mvc-5 -image-upload-delete/

14
Eric Bishard

utiliser Request.MapPath

string fullPath = Request.MapPath("~/Images/Cakes/" + photoName);
if (System.IO.File.Exists(fullPath))
{
   System.IO.File.Delete(fullPath);
}
52
Damith

File, tel que vous l'utilisez, est ambigu, d'où la "ligne sinueuse". Le IDE ne peut pas résoudre ce que vous voulez dire; 

System.Web.Mvc.Controller.File()

ou

System.IO.File

Utilisez un nom complet lorsque vous essayez d'utiliser l'API de fichier dans un contrôleur MVC.

6
Tieson T.

merci pour @ Réponse de Damith

J'ai créé cette fonction

private bool RemoveFileFromServer(string path)
{
    var fullPath = Request.MapPath(path);
    if (!System.IO.File.Exists(fullPath)) return false;

    try //Maybe error could happen like Access denied or Presses Already User used
    {
        System.IO.File.Delete(fullPath);
        return true;
    }
    catch (Exception e)
    { 
        //Debug.WriteLine(e.Message);
    }
    return false;
}

et voici une utilisation simple

RemoveFileFromServer("Content\img\ProfilePictures\User12.png");
4
Basheer AL-MOMANI

Ajoutez using System.IO; en haut de votre contrôleur.

1
Racil Hilan

vous pouvez également utiliser HostingEnvironment.MapPath insted of Request.MapPath

Cet exemple me convient très bien:

private bool DeleteFile(string image1_Address="")
        {
            try {
                if (image1_Address != null && image1_Address.Length > 0)
                {
                    string fullPath = HostingEnvironment.MapPath("~" + image1_Address);
                    if (System.IO.File.Exists(fullPath))
                    {
                        System.IO.File.Delete(fullPath);
                        return true;
                    }
                }
            }catch(Exception e)
            { }
            return false;
        }
0
Hamid