【问题标题】:upload image to Database by using WCF Restful service使用 WCF Restful 服务将图像上传到数据库
【发布时间】:2011-08-11 12:14:38
【问题描述】:

我正在使用 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 上传照片时,POST 成功。返回新的图像 id,我可以看到在数据库中创建的新记录。 但是,当我尝试将二进制文件从 DB 记录转换为 Image Stream 时:出现错误: “未找到适合完成此操作的成像组件。”

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?

非常感谢

【问题讨论】:

  • 有趣的是,您使用 webRequest 和 response 而不是客户端。这适用于流媒体吗?当您使用 webrequest 时,我不确定它是否仍在使用包。我需要有人向我解释这些概念。谢谢。

标签: iphone file-upload wcf-rest


【解决方案1】:

上面的代码确实有效。 我错过的部分是您需要在 web.config 中将其设置为“Streamed”的 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);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多