views:

50

answers:

2

Hey guys,

I am not getting any exception in the following code, however I also don't see the file which is suppose to be uploaded to the server (in this case a localhost) - could someone please point out the mistake?

As an add on, I need a simple silverlight file uploader with a progress bar, but I am having a really hard time try using the ones on the codeplex, Does anyone here has a good one for SL4?

public FileStream MyFS { get; set; }

private void UploadFile()
{
    FileStream _data; // The file stream to be read
    _data = MyFS;
    string uploadUri;
    uploadUri = @"http://localhost/MyApplication/Upload/Images/testXRay.gif";

    byte[] fileContent = new byte[_data.Length]; // Read the contents of the stream into a byte array
    int dataLength = int.Parse(_data.Length.ToString());
    _data.Read(fileContent, 0, dataLength);

    WebClient wc = new WebClient();
    wc.OpenWriteCompleted += new OpenWriteCompletedEventHandler(wc_OpenWriteCompleted);
    Uri u = new Uri(uploadUri);
    wc.OpenWriteAsync(u, null, fileContent); // Upload the file to the server
}

void wc_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e) // The upload completed
{
    if (e.Error == null)
    {
        // Upload completed without error
    }
}

Thanks,

Voodoo

+2  A: 

You are trying to write to a server URL that is an image, not a service:

uploadUri = @"http://localhost/MyApplication/Upload/Images/testXRay.gif";
...
Uri u = new Uri(uploadUri);
wc.OpenWriteAsync(u, null, fileContent);

You can't just write a file (via HTTP) to a webserver like that. The receiving URL needs to be a web service designed to accept the incoming byte stream.

I am sure there are better examples about, but try this link first.

Enough already
+1  A: 

Another problem with your code is that you haven't tried to write the file at all.

This line doesn't do what you think:

wc.OpenWriteAsync(u, null, fileContent); // Upload the file to the server

The call signature is OpenWriteAsync(URI, HTTPMETHOD, UserToken).

Let me break that down a little. URI I think you have. The HTTPMETHOD let's you set whether you are doing a post or a get. Probably you want to do an HttpPost. Finally that last item isn't for pushing the filecontent. It is more of a state variable so you can keep track of the request (more on this in a moment).

The way the HTTP stack works in Silverlight is that everything is asynchronous. So you in your case you are setting up a request and then telling the runtime that you want to write some data to the request. That is what your call does. It goes out and sets up to let you make a request (which may all happen on a background thread not the thread where the UI gets updated). Once this is set up it will call your callback event with a stream which you can write to. One of the things it sends back to you is that state variable (the UserToken) which gives you the ability to know which request it responded back to you with (which means that you could send multiple files back to the server at the same time).

It will also exposes a few other events that you can use to see if everything worked Ok (like you can get a response from the your call and see what the status code was --which will tell you if everything was successful or not). BTW, with every callback it sends that UserToken variable so your app can keep track of which request was being responded to (if there are more than one going on right now).

The links that the last guy provided should help you out some. He is right too, you need something on the server setup to respond to the request or rather you typically want to do this. You can set up a folder to allow you to push data directly to it, but honestly you don't want to do this as you would be opening up your server for hackers to exploit.

DevTheo