Android图像上传到c# . net REST服务
本文关键字:net REST 服务 图像 Android | 更新日期: 2023-09-27 18:12:10
我知道这个问题在stackoverflow上被问了很多,它遍布互联网,但似乎从来没有一个通用的或最好的解决方案来从多平台上传图像到。net REST服务。
我已经找到了这个解决方案,从一个问题之前问这里的服务端,我的第一个问题是,什么是最好的和最优化的方式从Android上传图像到特定的服务中指定的链接?
我的第二个问题是,我怎么能添加一个JSON与数据一起上传的图像?我已经看到了在头参数中附加数据而不是JSON的解决方案?怎样才能做到这一点呢?
上传文件到web service时,我有几个建议:
- 使用MultipartFormDataStreamProvider编写一个允许多部分文件上传的web服务
-
上传到web service时不要读取整个文件的内容。而是使用HttpClient库来上传多部分内容。看到MultipartEntity。
HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("Service URL"); FileBody body1 = new FileBody(new File(path), mimeType); MultipartEntity reqEntity = new MultipartEntity(); reqEntity.addPart("part0", body1); httppost.setEntity(reqEntity);
-
上传文件时使用android后台服务。如果它是大文件,那么它将需要很长时间来上传。如果应用进入后台
- 在服务器端,你需要一个自定义实现的MultipartFileStreamProvider类来传递额外的文件属性。
关于你的第一个问题:
从android上传图片的"最佳"方式,很大程度上取决于你的情况,例如:
- 如果你正在处理敏感照片,"最好"的方法可能是通过SSL上传,以更安全
- 上传多张照片?也许聚合压缩-上传-解压方法就足够了。
基本上我的意思是,使用最明显的方法来满足你的特定需求。
关于问题2
看一下这个问题。
可以使用getBase64Image方法在客户端获取图像字节然后将其弹出到发送给服务器的json中
下面是一个使用wcf rest上传文件的示例:
[ServiceContract]
interface IUploader
{
[WebInvoke(UriTemplate = "FileUpload?public_id={public_id}&tags={tags}",
Method = "POST",
ResponseFormat = WebMessageFormat.Json)]
UploadImageResult UploadImage(Stream fileContents, string public_id, string tags);
}
public class Uploader : IUploader
{
public UploadImageResult UploadImage(Stream fileContents, string public_id, string tags)
{
try
{
byte[] buffer = new byte[32768];
FileStream fs = File.Create(Path.Combine(rootFolderPath, @"test'test.jpg"));
int bytesRead, totalBytesRead = 0;
do
{
bytesRead = fileContents.Read(buffer, 0, buffer.Length);
totalBytesRead += bytesRead;
fs.Write(buffer, 0, bytesRead);
} while (bytesRead > 0);
fs.Close();
}
catch(Exception ex)
{
...
}
}
}
使用c#
调用// Create the REST URL.
string requestUrl = @"http://localhost:2949/fileupload?public_id=id&tags=tags";
//file to upload make sure it exist
string filename = @"C:'temp'ImageUploaderService'vega.jpg";
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUrl);
request.Method = "POST";
//request.ContentType = "text/plain";
request.ContentType = "application/json; charset=utf-8";
byte[] fileToSend = File.ReadAllBytes(filename);
request.ContentLength = fileToSend.Length;
using (Stream requestStream = request.GetRequestStream())
{
// Send the file as body request.
requestStream.Write(fileToSend, 0, fileToSend.Length);
requestStream.Close();
}
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
Console.WriteLine("HTTP/{0} {1} {2}", response.ProtocolVersion, (int)response.StatusCode, response.StatusDescription);
string text;
using (var sr = new StreamReader(response.GetResponseStream()))
{
text = sr.ReadToEnd();
}
dynamic testObj = Newtonsoft.Json.JsonConvert.DeserializeObject(text);
Console.WriteLine(string.Format("response url is {0}", testObj.url));
}
问题#2,您可以像示例中那样在请求的url上使用键/值对追加数据。