我正在使用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;
}
适用于较小尺寸的文件,但在大文件上出现错误。
答案 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)
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);