2011-04-23 152 views
1

我使用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服务上传才会发生。 如果图像是通过网络表单上传的,它可以很好地工作。

问:

  1. 在哪里我做错还是错过了什么?

  2. 我该如何写一个测试客户端来测试这个上传api?

千恩万谢

+0

有趣的是,你使用的WebRequest和响应,而不是客户端。这是否适用于流媒体?我不确定它在使用webrequest时仍然在使用软件包。我需要有人向我解释这些概念。谢谢。 – Amy 2011-10-06 22:07:39

回答

2

以上实际工作的代码。 我错过了的部分是你需要在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