загрузить изображение в базу данных с помощью службы WCF Restful

#iphone #file-upload #wcf-rest

#iPhone #загрузка файла #wcf-rest

Вопрос:

Я использую службу 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, публикация прошла успешно. Возвращается новый идентификатор изображения, и я вижу новую запись, созданную в базе данных.
Однако, когда я пытаюсь преобразовать двоичный файл из записи базы данных в поток изображений: я получил ошибку:
«Не найден компонент изображения, подходящий для выполнения этой операции».

похоже, что 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 загрузки?

большое спасибо

Комментарии:

1. Интересно, что вы используете WebRequest и response вместо client. Работает ли это для потоковой передачи? Я не уверен, что он все еще использует package при использовании webrequest. Мне нужен кто-нибудь, чтобы объяснить мне концепции. Спасибо.

Ответ №1:

приведенный выше код действительно работает. часть, которую я пропустил, — это transferModel, вам нужно установить для нее значение «Streamed» в web.config

Код для тестирования:

 static void Main()
        {
            string filePath = @"C:UsersDizzyDesktop600.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 resu<

            using (WebResponse response = request.GetResponse())
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                result = reader.ReadToEnd();
            }

            Console.WriteLine(result);
        }