使用Http上传的图片流保存时提示“参数无效”的完善解决方案--苏飞手记
写个手记,这个问题总算是解决了。
让我搞了一天,郁闷死了。
问题是这样的,写了个图片上传的功能,大致功能如下
1.上传图片
2.选取图片中的一部分做为头像
3.把选取的图片发送到各个图片服务器保存。
上传的方法我就不多说了这两天我整理出来给大家分享一下主要是使用Jquery的Jcrop方法进行图片的选取
问题就出在两个服务器之间传送流时
传的流方法如下
[C#] 纯文本查看 复制代码 RectangleF rec = new RectangleF(px, py, pw, ph);
//context.Request.InputStream;上传控件上传来的流信息
Bitmap nb = new Bitmap(context.Request.InputStream;);
Stream ms = new MemoryStream();
nb.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
这里得到了上传的流ms
下面是Post的方法
[C#] 纯文本查看 复制代码 public static string PostData(string url, Stream stream, bool allowRedirect)
{
try
{
HttpWebRequest wr = WebRequest.Create(url) as HttpWebRequest;
wr.Method = "POST";
wr.AllowAutoRedirect = allowRedirect;
wr.ContentType = "application/x-www-form-urlencoded";
wr.Timeout = 5000;
//Post的数据
byte[] postData = new byte[stream.Length];
wr.ContentLength = postData.Length;
stream.Read(postData, 0, postData.Length);
stream.Close();
stream = wr.GetRequestStream();
stream.Write(postData, 0, postData.Length);
stream.Close();
stream.Dispose();
HttpWebResponse webResponse = (HttpWebResponse)wr.GetResponse();
StreamReader sReader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8);
string responseData = sReader.ReadToEnd();
sReader.Close();
return responseData;
}
catch
{
return string.Empty;
}
}
这是同事以前写的没有做过修改的方法,
就是这个一直报错,保存的图片总是无法预览,哎
一开始我没有想到是这里的问题,一直没有看这个方法
结果一看就明白了。
因为我一直是写HttpHelper吧,对这些比较了解,如果是我肯定是直接使用我的HttpHelper类了,
但是这里毕竟是别人的没有用。
所以问题出现的
其实这个问题的原因很简单
就是转字节时的问题
使用上面的方法转字节会了出问题,修改成如下方法就没事了
[C#] 纯文本查看 复制代码 public static string PostData(string url, Stream stream, bool allowRedirect)
{
try
{
HttpWebRequest wr = WebRequest.Create(url) as HttpWebRequest;
wr.Method = "POST";
wr.AllowAutoRedirect = allowRedirect;
wr.ContentType = "application/x-www-form-urlencoded";
wr.Timeout = 5000;
//Post的数据
byte[] buffer = ((MemoryStream)stream).ToArray();
wr.ContentLength = buffer.Length;
wr.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse webResponse = (HttpWebResponse)wr.GetResponse();
StreamReader sReader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8);
string responseData = sReader.ReadToEnd();
sReader.Close();
return responseData;
}
catch
{
return string.Empty;
}
}
到这里问题就解决了。
|