2013-05-04 52 views
2

我知道这个问题已经被问及很多关于stackoverflow及其遍及互联网的情况,但似乎从未有过从多平台上传图片的常见或最佳解决方案.NET REST服务。将Android图片上传到C#.NET REST服务

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

我的第二个问题是,我如何添加一个JSON数据伴随正在上传的图像?我已经看到在头部参数中追加数据的解决方案,而不是作为JSON?什么是完美的方式来做到这一点?

+0

是否要将图像从Android上传到FTP服务器? – 2013-05-12 16:38:58

+1

我想上传图像到我的HTTP服务器不是FTP,使用我在问题中链接的代码 – 2013-05-13 08:27:47

+0

你不应该把任何东西放在图像bytearray上,也许在while循环后你可以发送另一个字符串,这意味着**发送是OK * * – 2013-05-13 08:49:18

回答

1

我有一些建议,同时上传文件的Web服务:

  1. 编写一个Web serivice,允许使用MultipartFormDataStreamProvider
  2. 不要读取整个文件内容,同时上传到Web服务的多部分文件上传。而是使用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类的自定义实现来传递其他文件属性。
1

关于你提到的第一个问题:

“最好”的方式上传从Android的图像,非常依赖于你的情况,如:

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

基本上我说的是,使用最明显的方法为您的具体需求。

关于问题2:

看一看this问题。

可以使用getBase64Image方法来获取客户端上的图像的字节数,然后弹出该到你的JSON发送到服务器

+0

为第一个问题,不安全我想要经常的一个图像上传,你有我附加的C#代码的任何代码示例? – 2013-05-06 08:46:57

+0

感谢第二个答案 – 2013-05-06 08:47:57

0

继承人使用WCF其余文件上传的例子:

[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中的键/值对中的数据等的例子。

希望这会有所帮助。

+0

嘿人感谢您的答案,但我一直在寻找Android代码,而不是C#(.net) – 2013-05-15 07:16:59

+0

不用担心,但我想从那里你可以知道如何将它转换为Java。 Java在android中使用的权利? – 2013-05-17 06:39:10