#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.
Это отлично работает, если изображение загружено через веб-форму.
Вопрос:
-
Где я сделал неправильно или пропустил?
-
как я могу написать тестовый клиент для тестирования этого 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);
}