我知道这个问题在stackoverflow及其整个互联网上都有很多问题,但似乎从来没有一个通用或最佳的解决方案将图像从多平台上传到.NET REST服务。
我从问题here之前的问题找到了解决方案,我的第一个问题是,将图像从Android上传到{中指定的特定服务的最佳和最优化的方法是什么? {3}}?
我的第二个问题是,如何添加带有数据的JSON以配合上传的图像?我已经看到在header param中附加数据而不是JSON的解决方案?这样做的最佳方式是什么?
答案 0 :(得分:1)
关于您的第一个问题:
从Android上传图像的“最佳”方式,很大程度上取决于您的情况,例如:
基本上我所说的是,使用最明显的方法来满足您的特定需求。
关于问题2:
查看this问题。
您可以使用getBase64Image方法在客户端获取图像字节,然后将其弹出到您发送到服务器的json中
答案 1 :(得分:1)
我在将文件上传到网络服务时提出的建议很少:
上传到网络服务时不要阅读整个文件内容。而是使用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后台服务。如果它是大文件,那么上传需要很长时间。如果应用程序转到backgournd 然后上传过程可能会被中断。
答案 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,您可以使用请求网址上的键/值对附加数据,如示例中所示。
希望这会有所帮助。