上传图像到数据库通过使用WCF RESTful服务
问题描述:
我使用WCF RESTful服务来上传图片到我的DATABSE 代码:上传图像到数据库通过使用WCF RESTful服务
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "AddDealImage/{id}")]
long AddDealImage(string id, Stream image);
public long AddDealImage(string id, Stream image)
{
//add convert Stram to byte[]
byte[] buffer = UploadFile.StreamToByte(image);
//create image record for database
Img img = ImgService.NewImage(DateTime.Now.ToFileTime().ToString(), "", buffer, "image/png");
ImgService.AddImage(img);
//return image id
return img.ImageId;
}
public static byte[] StreamToByte(Stream stream)
{
byte[] buffer = new byte[16 * 1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
问题: 当我通过iPhone的发帖成功上传我的照片。返回新的图像ID,我可以看到在数据库中创建的新记录。 但是,当我尝试将二进制数据库记录转换为图像流时:出现错误: “找不到适合完成此操作的成像组件。”
它似乎是MemoryStream已损坏。
//photoBytes from database
MemoryStream photoStream = new MemoryStream(photoBytes)
//Error happened here
var photoDecoder = BitmapDecoder.Create(
photoStream,
BitmapCreateOptions.PreservePixelFormat,
BitmapCacheOption.None);
另外,错误时图像通过WCF RESTful服务上传才会发生。 如果图像是通过网络表单上传的,它可以很好地工作。
问:
在哪里我做错还是错过了什么?
我该如何写一个测试客户端来测试这个上传api?
千恩万谢
答
以上实际工作的代码。 我错过了的部分是你需要在web.config中
代码将其设置为“流”进行测试transferModel:
static void Main()
{
string filePath = @"C:\Users\Dizzy\Desktop\600.png";
string url = "http://localhost:13228/ApiRestful.svc/AddDealImage/96";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Accept = "text/xml";
request.Method = "POST";
using (Stream fileStream = File.OpenRead(filePath))
using (Stream requestStream = request.GetRequestStream())
{
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int byteCount = 0;
while ((byteCount = fileStream.Read(buffer, 0, bufferSize)) > 0)
{
requestStream.Write(buffer, 0, byteCount);
}
}
string result;
using (WebResponse response = request.GetResponse())
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
result = reader.ReadToEnd();
}
Console.WriteLine(result);
}
+0
不错,谢谢发布解决方案 – Mark 2011-05-10 00:26:05
有趣的是,你使用的WebRequest和响应,而不是客户端。这是否适用于流媒体?我不确定它在使用webrequest时仍然在使用软件包。我需要有人向我解释这些概念。谢谢。 – Amy 2011-10-06 22:07:39