2012-02-13 5 views
0

Я использую Imgur API для загрузки изображений, но я получаю исключение на этой линии:Invalid URI: Строка Uri слишком долго с помощью Imgur API

string uploadRequestString = "image=" + Uri.EscapeDataString(Convert.ToBase64String(imageData)) + "&key=" + apiKey; 

Invalid URI: Строка Uri слишком длинный.

Полный код:

public static string PostToImgur(string imagFilePath, string apiKey) 
{ 
    byte[] imageData; 
    FileStream fileStream = File.OpenRead(imagFilePath); 
    imageData = new byte[fileStream.Length]; 
    fileStream.Read(imageData, 0, imageData.Length); 
    fileStream.Close(); 

    string uploadRequestString = "image=" + Uri.EscapeDataString(Convert.ToBase64String(imageData)) + "&key=" + apiKey; 

    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://api.imgur.com/2/upload"); 
    webRequest.Method = "POST"; 
    webRequest.ContentType = "application/x-www-form-urlencoded"; 
    webRequest.ServicePoint.Expect100Continue = false; 

    StreamWriter streamWriter = new StreamWriter(webRequest.GetRequestStream()); 
    streamWriter.Write(uploadRequestString); 
    streamWriter.Close(); 

    WebResponse response = webRequest.GetResponse(); 
    Stream responseStream = response.GetResponseStream(); 
    StreamReader responseReader = new StreamReader(responseStream); 

    string responseString = responseReader.ReadToEnd(); 

    XmlDocument doc = new XmlDocument(); 
    doc.InnerXml = responseString; 
    XmlElement root = doc.DocumentElement; 
    responseString = root.GetElementsByTagName("original")[0].InnerText; 

    return responseString; 
} 

Он работает для уменьшения размера файла размера, но получить эту ошибку на больших файлах.

ответ

2

Я подозреваю, что выход System.Convert.ToBase64String(imageData) слишком длинный, чтобы быть допустимым URI, который составляет около 2000 символов (I думаю, это 2048).

Это будет связано с размером изображения, поскольку меньшее изображение может быть закодировано в более короткую строку.

Вы не сможете обойти этот предел.

+0

Спасибо за ваш ответ, сэр, если я загрузить 20Kb он работает, но я примерил размер изображений 500Kb и я вижу эту ошибку. – user969068

2

Используйте более короткий URL. URLL для каждой спецификации ограничен, и загрузка двоичных данных WILL ударит эту длину.

Ничего не происходит - обычно данные привязываются как переменные запроса формы, без части URL.

"изображение =" + Uri.EscapeDataString (System.Convert.ToBase64String (ImageData))

не будет работать. У вас не может быть URL с несколькими мегабайтами.

What is the maximum length of a URL in different browsers?

имеет обсуждение. Вывод состоит в том, что около 2000 символов - это максимальная длина.

Как бы то ни было, поместите изображение в переменную, которая является частью полезной нагрузки запроса, а не URL-адресом.

0

Вы можете использовать запрос PUT, если это возможно.

0

Easy с http://restsharp.org/

FileStream fileStream = File.OpenRead(imagFilePath); 
imageData = new byte[fileStream.Length]; 
fileStream.Read(imageData, 0, imageData.Length); 
fileStream.Close(); 

RestClient client = new RestClient("https://api.imgur.com/3/image"); 
     RestRequest request = new RestRequest() 
     { 
      Method = Method.POST, 
     }; 
request.AddHeader("Authorization", "YOUR Client-ID"); 
request.AddParameter("image", Convert.ToBase64String(imageData), ParameterType.RequestBody); 
IRestResponse restResponse = client.Execute(request); 
Смежные вопросы