gpt4 book ai didi

c# - 使用 WCF 服务和 Xamarin.Forms 将图像存储到服务器

转载 作者:太空宇宙 更新时间:2023-11-03 12:30:58 25 4
gpt4 key购买 nike

我正在使用 Xamarin Forms 开发移动应用程序,在应用程序中将图像发送到服务器。为了发送图像,我们使用了 WCF 服务。

下面是 Xamarin 应用程序的代码

using (var memoryStream = new MemoryStream())
{
pick.GetStream().CopyTo(memoryStream);
pick.Dispose();
byte[] byteImageArray = memoryStream.ToArray();
try
{
var imageStream = new ByteArrayContent(byteImageArray);
var multi = new MultipartContent();
multi.Add(imageStream);

var client = new HttpClient();
var result = client.PostAsync("http://www.test.com/Services/Service.svc/SaveImage", multi).Result;

var json = await result.Content.ReadAsStringAsync();
var strNo = JsonConvert.DeserializeObject<string>(json);

}
catch (Exception ex)
{
await DisplayAlert("Error", ex.Message, "Ok");
}
}

对于 WCF 服务

    public string SaveImage(Stream data)
{
byte[] byteImage = ReadFully(data);
//Database logic to insert byte array
}

public static byte[] ReadFully(Stream input)
{
using (MemoryStream ms = new MemoryStream())
{
input.CopyTo(ms);
return ms.ToArray();
}
}

现在使用此代码图像已成功转换并存储在数据库 blob 中。我面临的问题是,每当我将 blob 转换回图像时,图像就会损坏。当我使用 asp.net 应用程序将图像插入 blob 时,blob 的数据长度显示为 18901,而使用移动应用程序数据长度插入相同图像时,数据长度为 18987。请帮助我解决数据长度问题,或者请指导使用 WCF 和 Xamarin 表单将图像存储到数据库中的更简单方法。

最佳答案

例如,创建一个名为 PicturesController 的 WebAPI。您必须使用 PUT 动词

/// <summary>
/// Receiving an image across WebAPI
/// </summary>
/// <returns></returns>
[HttpPut]
public HttpResponseMessage Put()
{
var result = new HttpResponseMessage(HttpStatusCode.OK);

if (Request.Content.IsMimeMultipartContent())
{
try
{
Request.Content.LoadIntoBufferAsync().Wait();
Request.Content.ReadAsMultipartAsync<MultipartMemoryStreamProvider>(
new MultipartMemoryStreamProvider()).ContinueWith((task) => {
MultipartMemoryStreamProvider provider = task.Result;
foreach (HttpContent content in provider.Contents)
{
Stream stream = content.ReadAsStreamAsync().Result;
Image image = Image.FromStream(stream);

try
{
string filename = string.Format("{0}{1}{2}{3}",
DateTime.Now.Year,
DateTime.Now.Month,
DateTime.Now.Day,
DateTime.Now.Second) + ".jpg";
foreach (var h in content.Headers.ContentDisposition.Parameters)
{
if (h.Name.ToLower() == "filename")
{
filename = h.Value.Replace("\\", "/").Replace("\"", "");
var pos = filename.LastIndexOf("/");
if (pos >= 0)
{
filename = filename.Substring(pos + 1);
}
break;
}
}

string filePath = ConfigurationManager.AppSettings["Pictures"]
.ToString();
string fullPath = Path.Combine(filePath, filename);

EncoderParameters encparams = new EncoderParameters(1);
encparams.Param[0] = new EncoderParameter(Encoder.Quality, 80L);
ImageCodecInfo ici = null;
foreach (ImageCodecInfo codec in ImageCodecInfo
.GetImageEncoders())
{
if (codec.MimeType == "image/jpeg")
{
ici = codec;
break;
}
}

image.JpegOrientation().Save(fullPath, ici, encparams);
}
catch (Exception ex)
{
}
}
});
}
catch (Exception ex)
{
result.StatusCode = HttpStatusCode.InternalServerError;
}

return result;
}
else
{
throw new HttpResponseException(Request.CreateResponse(
HttpStatusCode.NotAcceptable,
"This request is not properly formatted"));
}
}

在这段代码中,我创建了一个临时文件名。如果您将一个作为 header 参数传递,我将使用它。我将图像保存在文件夹 Pictures 中,然后从 web.config 中读取该文件夹。该文件为 jpeg 格式,因为通常这是您设备上的图像格式。

执行此操作时,您必须在 Xamarin 项目中创建一个网络客户端。

/// <summary>
/// Uploads the photo.
/// </summary>
/// <returns>The photo.</returns>
/// <param name="photoBytes">Photo bytes.</param>
public async Task<bool> UploadPhoto(byte[] photoBytes, int PropertyId, string fileName)
{
bool rtn = false;

var content = new MultipartFormDataContent();
var fileContent = new ByteArrayContent(photoBytes);
fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
fileContent.Headers.ContentDisposition =
new ContentDispositionHeaderValue("attachment") {
FileName = fileName + ".jpg"
};
content.Add(fileContent);
fileContent.Headers.ContentDisposition.Parameters.Add(
new NameValueHeaderValue("<otherParam>", "<otherParamValue>"));

string url = RestURL() + "Pictures/Put";
try
{
using (var client = new HttpClient())
{
// add an authotization token if you have one
//client.DefaultRequestHeaders.Add("authenticationToken", "yourToken");
await client.PutAsync(url, content);
rtn = true;
}
}
catch (Exception ex)
{
}

return rtn;
}

记得包含

using System.Net.Http;
using System.Net.Http.Headers;

我在很多应用程序中都使用了这个实现,并且运行良好。如果您有任何改进建议,请告诉我。

关于c# - 使用 WCF 服务和 Xamarin.Forms 将图像存储到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42813900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com