Search code examples
c#asp.net-mvcflickr

How do I get the value of input file field using MVC5?


I want to let the user select a file from his/her computer, and then upload it to Flickr. The point is that, when I upload a custom image from my computer, it all works fine, but when I add an extra field for the input file but program suddenly doesn't work.

Test.cshtml:

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

HomeController.cs:

public ActionResult Upload(HttpPostedFileBase file, FormCollection form)
{
    if (Request.QueryString["oauth_verifier"] != null && Session["RequestToken"] != null)
    {
        // Flickr relevant code...
        var tmpFilePath = Server.MapPath("~/App_Data/Uploads/Pictures");

        if (file == null || file.ContentLength == 0)
        {
            return RedirectToAction("Index"); // It keeps hitting this!
        }

        var filename = Path.GetFileName(file.FileName);
        var path = Path.Combine(tmpFilePath, filename);

        if (System.IO.File.Exists(path))
        {
            System.IO.File.Delete(path);
        }

        file.SaveAs(path);

        string photoId = flickr.UploadPicture(path, "Test picture");

        if (String.IsNullOrEmpty(photoId))
        {
            System.Diagnostics.Debug.WriteLine("Upload failed!");
        }

        System.IO.File.Delete(path);
    }
    else
    {
        // Flickr relevant code...
    }

    return View("Test");
}

As long as I know, because MVC is a server-side framework, first of all I need to upload the picture to my server, and then upload it to Flickr. The point is that, I want to put the file in my App_Data/Upload/Pictures folder, and then upload it to Flickr, and afterwards delete it from there. So, I want to keep my server clean.

UPDATE: It keeps hitting the return RedirectToAction("Index"); part, and redirects.


Solution

  • You're missing enctype="multipart/form-data" from you form tag. Without that, file data is not uploaded to the server when the form is submitted.

    Change your form call to:

    @using (Html.BeginForm("Upload", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))