【问题标题】:Android Image upload to C# .NET REST serviceAndroid 图像上传到 C# .NET REST 服务
【发布时间】:2013-04-28 17:05:02
【问题描述】:

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

我从here 之前针对服务端提出的问题中找到了这个解决方案,我的第一个问题是,将图像从 Android 上传到link 中指定的特定服务的最佳和最优化方式是什么?

我的第二个问题是,如何添加带有数据的 JSON 以伴随正在上传的图像?我已经看到在标头参数中附加数据而不是作为 JSON 的解决方案?什么是完美的方法?

【问题讨论】:

  • 你想把你的图片从安卓上传到 FTP 服务器吗?
  • 我想使用我在问题中链接的代码将图像上传到我的 http 服务器而不是 FTP
  • 你不应该在图像字节数组中放置任何东西,也许在while循环之后你可以发送另一个字符串,这意味着发送正常

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


【解决方案1】:

上传文件到网络服务时我有一些建议:

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

  4. 在服务器端,您需要自定义实现 MultipartFileStreamProvider 类来传递额外的文件属性。

【讨论】:

    【解决方案2】:

    关于你的第一个问题:

    从安卓上传图片的“最佳”方式,很大程度上取决于你的情况,例如:

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

    基本上我的意思是,针对您的特定需求使用最明显的方法。

    关于问题2:

    看看this的问题。

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

    【讨论】:

    • 对于第一个问题,不安全我想要常规的一张图片上传,你有我附加的 c# 代码的任何代码示例吗?
    • 感谢第二个回答
    【解决方案3】:

    这是使用 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 上使用键/值对附加数据。

    希望这会有所帮助。

    【讨论】:

    • 嘿,谢谢你的回答,但我正在寻找 android 代码而不是 C#(.net)
    • 不用担心,但我认为从那里您可以了解如何将其转换为 java。 Java 用在 android 上吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 2012-07-15
    • 2013-12-17
    • 2014-03-21
    • 2014-03-24
    • 1970-01-01
    相关资源
    最近更新 更多