0

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

4 回答 4

2

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

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

你将无法绕过这个限制。

于 2012-02-13T09:24:35.213 回答
2

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

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

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

不管用。您不能拥有多兆 URL。

不同浏览器中 URL 的最大长度是多少?

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

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

于 2012-02-13T09:24:42.310 回答
0

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

于 2012-02-13T09:25:54.260 回答
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);
于 2013-03-15T13:42:10.597 回答