views:

714

answers:

1

Here's my method

    [AcceptVerbs(HttpVerbs.Post)]
    public void SaveImage(FormCollection formValues)
    {
        byte[] contents = Convert.FromBase64String(Request.Form["file"]);
        System.IO.File.WriteAllBytes(Server.MapPath(Request.Form["name"]), contents);
    }

It is getting posted to from this actionscript method:

    public function encodeAndSave(e:MouseEvent = null):void
 {
  var date:Date = new Date();
  var by:ByteArray = PNGEnc.encode(canvas.main_bdata);
  var req:URLRequest = new URLRequest(server_path+"Home/SaveImage");
  var params:URLVariables = new URLVariables();
  params.file = Base64.encodeByteArray(by);
  params.name = "MyImage.png";
  req.method = URLRequestMethod.POST;
  req.data = params;
  var ldr:URLLoader = new URLLoader(req);

  ldr.addEventListener(Event.COMPLETE, complete);

  ldr.load(req);

  function complete(e:Event):void
  {
   navigateToURL(new URLRequest("?" + Math.random()), "_self");

  }

 }

But when the encodeAndSave method runs, no file gets saved to the server...

Does anyone know how to tell if the SaveImage method has even ran? Also, when I type: http://www.mysite.com/Home/SaveImage into the address bar it says "The resource cannot be found".

Anyone have any ideas as to why it would be doing this or what i can do to try to figure it out?

If you need any more information please let me know and I'll update my question.

Thanks,
Matt

+5  A: 

I had a [lot] of trouble with this and I used this in the end;

View:

<% using (Html.BeginForm( "PhotoAdd", "Photos", FormMethod.Post, new { enctype = "multipart/form-data" }))   { %>

<input type="file" id="file" name="file" class="field" style="width:300px;"/>

<%} %>

Controller:

var file = Request.Files["file"];
byte[] buf = new byte[file.ContentLength];
file.InputStream.Read(buf, 0, file.ContentLength);

I'm not sure whether this is what you are looking for but like I said I have a lot of problems allowing my users to upload a photo of themselves in my web site.

Basically I have a View which contains a field of type "file" on it and a "Submit" button for the post back event.

Then in the controller I have the following;

    [AcceptVerbs( HttpVerbs.Post ), Authorize]
    public ActionResult PhotoAdd(FormCollection collection)
    {
        try
        {
            var file = Request.Files["file"];

            byte[] buf = new byte[file.ContentLength];
            file.InputStream.Read(buf, 0, file.ContentLength);

The difficulty I ran into was getting the controller to get the request along with the file name and path. Once I had that I could convert the file to an array of bytes that I could then save to a SQL Database and an Image field.

The one biggest thing I was missing was the Form method in the View which needs to read

<% using (Html.BeginForm( "PhotoAdd", "Photos", FormMethod.Post, new { enctype = "multipart/form-data" }))   { %>

The enctype allows you to pick up the filename and path of the selected file and for the controller to be able to grab the inputstream. Without it I found that either Request.Files was empty or that it only contained the file name and hence could not open it.

Once you have saved the image to your database, displaying it is a doddle.

I hope this answers your question.

griegs
can you explain a bit? Sorry it doesn't look like something that would just be a plug and play so I just wanna figure out how it works so I can change it a bit for my web app
Matt
I would add, I've been able to add "HttpPostedFileBase file" to the parameter list of my controller, and that allows me to skip the whole "Request.Files" section as file's already loaded with the uploaded data.
Zhaph - Ben Duguid