Неверный URI: строка Uri слишком длинная с использованием Imgur API - PullRequest
0 голосов
/ 13 февраля 2012

Я использую imgur API для загрузки изображений, но получаю исключение в этой строке:

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

Неверный 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;
}

Работает для файлов меньшего размера, но выдает эту ошибку для больших файлов.

Ответы [ 4 ]

2 голосов
/ 13 февраля 2012

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

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

"image =" + Uri.EscapeDataString (System.Convert.ToBase64String (imageData))

НЕ РАБОТАЕТ. Вы не можете иметь несколько мегабайт URL.

Какова максимальная длина URL в разных браузерах?

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

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

2 голосов
/ 13 февраля 2012

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

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

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

0 голосов
/ 15 марта 2013

Легко с 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);
0 голосов
/ 13 февраля 2012

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

...