Android Image上传到C#.NET REST服务

时间:2013-05-04 10:40:20

标签: c# android .net rest image-uploading

我知道这个问题在stackoverflow及其整个互联网上都有很多问题,但似乎从来没有一个通用或最佳的解决方案将图像从多平台上传到.NET REST服务。

我从问题here之前的问题找到了解决方案,我的第一个问题是,将图像从Android上传到{中指定的特定服务的最佳和最优化的方法是什么? {3}}?

我的第二个问题是,如何添加带有数据的JSON以配合上传的图像?我已经看到在header param中附加数据而不是JSON的解决方案?这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:1)

关于您的第一个问题:

从Android上传图像的“最佳”方式,很大程度上取决于您的情况,例如:

  • 如果您处理敏感照片,“最佳”方式可能是通过SSL上传以更安全
  • 上传多张照片?也许聚合的压缩上传解压缩方法就足够了。

基本上我所说的是,使用最明显的方法来满足您的特定需求。

关于问题2:

查看this问题。

您可以使用getBase64Image方法在客户端获取图像字节,然后将其弹出到您发送到服务器的json中

答案 1 :(得分:1)

我在将文件上传到网络服务时提出的建议很少:

  1. 编写一个允许使用MultipartFormDataStreamProvider
  2. 上传多部分文件的网络服务
  3. 上传到网络服务时不要阅读整个文件内容。而是使用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);      
    
  4. 上传文件时使用android后台服务。如果它是大文件,那么上传需要很长时间。如果应用程序转到backgournd 然后上传过程可能会被中断。

  5. 在服务器端,您需要一个MultipartFileStreamProvider类的自定义实现来传递其他文件属性。

答案 2 :(得分:0)

下面是使用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,您可以使用请求网址上的键/值对附加数据,如示例中所示。

希望这会有所帮助。