views:

291

answers:

2

I have an image upload form

<% using (Html.BeginForm("PictureValidateAndSave", "UserGallery", new {}, FormMethod.Post, new { enctype = "multipart/form-data"})) { %>
    <table>
        <tr>
            <td> Album Name: </td>
            <td> <%= Html.DropDownList("albumList") %></td>
        </tr>
        <tr>
            <td> File Location: </td> 
            <td> <input type="file" name="picture" accept="image/gif, image/jpeg" /> </td>  
        <tr>
        <tr>
            <td> Picture name: </td>
            <td> <input name="pictureName" style="width: 147px;"/> </td>
        </tr>
    </table>            
    <p> <input type="submit" value="Save" /> </p>
<% } %>

That posts back to the action

public ActionResult PictureValidateAndSave(long albumList, HttpPostedFileBase picture, string pictureName)

The code works accross all browsers but Google Chrome. My IDE is Visual Studio 2k8, and I haven't figured out how to debug on Google Chrome with it, however, I am throwing error messages, and I know that for some reason under chrome, the following check doesn't pass:

string mimeType = picture.ContentType;

// Check for the correct mimeType to define the extension
switch (mimeType)
{
    case "image/pjpeg":
        mimeType = ".jpeg";
        break;
    case "image/png":
        mimeType = ".png";
        break;
    case "image/x-png":
        mimeType = ".png";
        break;
    case "image/gif":
        mimeType = ".gif";
        // Conversion to image
        Image gifImage = Image.FromStream(picture.InputStream);
        FrameDimension dimension = new FrameDimension(gifImage.FrameDimensionsList[0]);

        int frameCount = gifImage.GetFrameCount(dimension);
        // Reject if its an animated gif
        if (frameCount > 1)
        {
            return RedirectToAction("UploadPicture", new { error = 3 });
        }
        break;
    default:
        return RedirectToAction("UploadPicture", new { error = 1 });
}

So apparently, under Chrome, the HttpPostedFileBase parameter picture isn't encoded right and loses its mime type, howwever, this might not be the only problem. What is excatly wrong with the HttpPostedFileBase parameter under Chrome, and how can I fix it?

Thank you for your attention, and thanks in advance for any help.

A: 

Just use hanselmans method, works perfect in chrome.

Al Katawazi
Thank you Al, looking at the example helped me confirm I was doing the right thing. It was a small problem with a mimetype I had not identified though. I still need to read more about the differences between jpeg and pjpeg to fully understand why Chrome is doing things differently from IE8 and FF. Chrome is indentifying all pjpegs as regular jpegs.
godhandiscen
A: 

I've just debugged some of my code that uploads files to mvc and i get the exact MIME string from the HttpPostedFileBase in Firefox as i do in Chrome: "image/jpeg" and "image/gif" respectively. So i don't think there is a problem with the browser interpreting the file type.

Take a look at this answer. It has a lot of my code in it regarding uploading and typing the 'HttpPostedFileBase' data. It might get you un-stuck.

cottsak
Thank you cottsak. Sorry for the late reply. I shelved this bug and I couldn't get back to it until now. I found my problem. Apparently that IE8 and FF interpret as image/pjpeg get interpreted in Chrome as image/jpeg, which is still valid, however I do not yet understand why there is such a difference.
godhandiscen
I see. It seems that you might be uploading a progressive jpeg and IE wants to treat those differently. I'd just suggest using regex or similar to simplify filtering for the variation in the MIME string. More here about progressive jpeg upload in IE: http://stackoverflow.com/questions/115705/why-does-ie7-specify-a-mime-type-of-image-pjpeg-rather-than-just-image-jpeg
cottsak