无效的URI:使用Imgur API,Uri字符串太长

时间:2012-02-13 09:19:36

标签: c# .net exception-handling uri imgur

我正在使用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 个答案:

答案 0 :(得分:2)

我怀疑System.Convert.ToBase64String(imageData)的输出太长而无法成为大约2000个字符的有效URI(我认为它是2048)。

这与图像的大小有关,因为较小的图像可以编码为较短的字符串。

你无法绕过这个限制。

答案 1 :(得分:2)

使用较短的网址。每个规范的URLL是有限的,上传二进制数据将吹这个长度。

没有人这样做 - 通常数据作为表单请求变量附加,不是URL的一部分。

  

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

不行。你不能拥有多兆网址。

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

进行了讨论。结论是大约2000个字符是最大长度。

无论如何,将图像放入一个变量,该变量是请求有效负载的一部分,而不是url。

答案 2 :(得分:0)

如果可能,您可以使用PUT请求。

答案 3 :(得分:0)

轻松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);