【问题标题】:Invalid URI: The Uri string is too long using Imgur API无效的 URI:使用 Imgur API 的 Uri 字符串太长
【发布时间】:2012-03-04 16:57:49
【问题描述】:

我正在使用 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;
}

它适用于较小的文件,但在大文件上会出现错误。

【问题讨论】:

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


    【解决方案1】:

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

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

    您将无法绕过此限制。

    【讨论】:

    • 感谢您的回复先生,如果我上传一个 20Kb 的它可以工作,但我尝试了 500Kb 大小的图像,我看到了那个错误。
    【解决方案2】:

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

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

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

    不会工作。您不能拥有多兆的 URL。

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

    有一个讨论。结论是最大长度约为 2000 个字符。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-03
          • 2013-04-22
          • 1970-01-01
          • 1970-01-01
          • 2022-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多