So basically this part of the program is editing/uploading a new profile picture to a user's account. Previously, it worked fine. Then I decided to add in some picture validations (picture has to have certain dimensions, etc). So I made a separate Helper class for that that takes in the HttpPostedFileWrapper variable initialized in the controller.

So, in this controller function, I initialize a new instance of the ValidateImage class which holds two functions (DoValidation and Resize).

The Resize function was working fine until I added the DoValidation function and I feel like it has something to do with the memory stream.

I now get an "Invalid Parameter" error in the ResizeImage function (see below), even though I never changed that code and was working fine previously. Does it have something to do with the filestream not being closed properly or something?

Here is the code:

 //Controller.cs

public virtual ActionResult EditMyProfilePicture(bool? ignore)
{
    var loggedInEmployee = this.EmployeeRepos.GetEmployeeByUserName(User.Identity.Name);
    int tgtWidth = 250, tgtHeight = 250;

    try
    {
        // get a reference to the posted file
        var file = Request.Files["FileContent"] as HttpPostedFileWrapper;
        ValidateImage img = new ValidateImage();

        if (file != null && file.ContentLength > 0)
        {
            // isolate the filename - IE returns full local path, other browsers: just the file name.
            int index = file.FileName.LastIndexOf("\\");
            // if not IE, index will be -1, but -1 + 1 = 0 so we are okay.  
            string fileName = file.FileName.Substring(index + 1);

            // Validate the image
            img.DoValidation(file, tgtWidth, tgtHeight);
            if (!img.IsValidated)
            {
                throw new ArgumentException(img.Message);
            }
            else
            {
                byte[] resizedImg = img.Resize(file, tgtWidth, tgtHeight);
                this.EmployeeRepos.SaveProfileImage(loggedInEmployee.EmployeeCode, resizedImg);
            }

            return RedirectToAction(MVC.Employees.EditMyProfile());
        }
        else
        {
            throw new ArgumentException("Please select a file to upload.");
        }
    }
    catch (Exception ex)
    {
        ModelState.AddModelError(string.Empty, ex.Message);
    }

    return View(Views.EditMyProfilePicture, loggedInEmployee);
}

// ValidateImage.cs

public class ValidateImage
{
    public string Message { get; private set; }
    public bool IsValidated { get; private set; }

    public void DoValidation(HttpPostedFileWrapper file, int tgtWidth, int tgtHeight)
    {
        try
        {
            Image img = Image.FromStream(file.InputStream);

            int curHeight = img.Height, curWidth = img.Width;

            // check for image too small
            if (curHeight < tgtHeight || curWidth < tgtWidth)
            {
                Message = "image is too small. please upload a picture at least 250x250.";
                IsValidated = false;
                return;
            }
            // check for image is square
            else if (curHeight != curWidth)
            {
                Message = "image is not a square.";
                IsValidated = false;
                return;
            }
            else
            {
                IsValidated = true;
            }
        }
        catch
        {

        }

    }

    public byte[] Resize(HttpPostedFileWrapper file, int tgtWidth, int tgtHeight)
    {
        byte[] bytes = new byte[file.ContentLength];
        file.InputStream.Read(bytes, 0, file.ContentLength);
        file.InputStream.Close(); // close the file stream.


        // Down-sample if needed from current byte array to max 250x250 Jpeg
        byte[] resized = Helpers.ImageResizer.ResizeImage(bytes, tgtWidth, tgtHeight, ResizeOptions.MaxWidthAndHeight, ImageFormat.Jpeg);
        return resized;
    }
}

// Resize Image function

public static byte[] ResizeImage(byte[] bytes, int width, int height, ResizeOptions resizeOptions, ImageFormat imageFormat)
{
    using (MemoryStream ms = new MemoryStream(bytes))
    {
        Image img = Image.FromStream(ms);
        Bitmap bmp = new Bitmap(img);
        bmp = ResizeImage(bmp, width, height, resizeOptions);
        bmp.SetResolution(72, 72);
        bmp.Save(ms, imageFormat);

        return ms.ToArray();
    }
}
0

There are 0 best solutions below