tags:

views:

663

answers:

6

I am using the Web Client Class to download files from the internet (Flickr actually). This works fine as long as I use : WebClient().DownloadData(string) , however this locks up the UI as it is Not asynchronous.

However when I try WebClient().DownloadDatAsync(string), I get a compile error: "Unable to convert System.String to System.Uri".

The string MediumUrl returns "http://farm4.static.flickr.com/2232/2232/someimage.jpg"

So the question is how do I convert the string "http://farm4.static.flickr.com/2232/2232/someimage.jpg" to a Uri.

Things I have tried-

  • a)I have tried to cast it to Uri but that does not work either.
  • b) I have tried Uri myuri = new uri(string) - errors out as above.

      foreach (Photo photo in allphotos)
        {
            //Console.WriteLine(String.Format("photo title is :{0}", photo.Title));
            objimage = new MemoryStream(wc.DownloadData(photo.MediumUrl));
            images.Add(new Pictures(new Bitmap(objimage), photo.MediumUrl, photo.Title));
    
    
    
    }
    
+1  A: 
objimage = new MemoryStream(wc.DownloadData(new Uri(photo.MediumUrl)));

b) I have tried Uri myuri = new uri(string) - errors out as above.

This is the usual way to create a Uri from a string... I don't see why it wouldn't work if the string is a valid URI

Thomas Levesque
Thanks.Tried that too ( sorry did not mention above) - no dice. Compile error.
dezkev
What compile error ?
Thomas Levesque
Builds OK in my project
Mitch Wheat
Thie error could be due to the typo in things I have tried (b). We just can't tell.
spender
A: 

Uri.Parse

Yossarian
**NOTE: This API is now obsolete.**
spender
It's better to use `Uri.TryCreate` instead: http://msdn.microsoft.com/en-us/library/ms131572.aspx
0xA3
A: 
var yourUri = new UriBuilder(yourString).Uri;

So your example would be:

wc.DownloadDataAsync(new UriBuilder(photo.MediumUrl).Uri);
objimage = new MemoryStream(wc.Result);

You may need to put a check in to see the operation has completed.

Hope that helps,

Dan

Daniel Elliott
Sorry Does'nt work; Now the error is as follows:Cannot resolve constructor: Memory Stream(void) candidates are:MemoryStream (byte[]) (in class memory stream)memoryStream (int) (in class memory stream)
dezkev
public void DownloadDataAsync(System.Uri address)Member of System.Net.WebClientSummary:Downloads the specified resource as a System.Byte array. This method does not block the calling thread.Parameters:address: A System.Uri containing the URI to download.
dezkev
A: 

If I understand your code correctly, then

wc.DownloadDataAsync(new Uri(photo.MediumUrl));

should work.

Mitch Wheat
Yes, I want to use the Async method but I cannot because of the string to Uri thingy. The method above works fine.
dezkev
A: 

This works just fine;

System.Uri uri = new System.Uri("http://farm4.static.flickr.com/2232/2232/someimage.jpg");

By the way; I notice you mistyped the expression new uri(..., with lowercase uri. This is not your problem, is it? Because it should be "new Uri".

Digitalex
No there are no typos in my code just in the typing here.Also the URl is dynamically generated at runtime.
dezkev
A: 

Okay, so I think if the others have proved your URI is valid in their code and it compiles etc. and you also mention it is generated at runtime - it could be that the UriString you are generating at runtime is invalid and not what you are expecting?

Instead of letting an exception be thrown for attempting to create a Uri from an invalid string, I would suggest the following method IsWellFormedUriString on the Uri class.

string uriString = "your_UriString_here";

if (Uri.IsWellFormedUriString(uriString, UriKind.Absolute))
{
    Uri uri = new Uri(uriString);
}
else
{
    Logger.WriteEvent("invalid uriString: " + uriString);
}

Might help with your debugging also.

Peter Kelly