我要做的是将我的图像从Android发送到我的网络服务C#。 在Android方面,我没有任何错误,也没有任何警告,但在服务上没有任何显示,它实际上根本没有得到图像。
我仍然特别擅长服务,所以任何帮助都会非常感激!!
我的 Android AsyncTask看起来像这样:
@Override
protected String doInBackground(File... file) {
String imageDescriptionTemp = "Photo Temp Description.";
String PostRequestUri = "https://demo.relocationmw.com/ws_docmgmt/Service1.svc";
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(PostRequestUri);
FileBody bin1 = new FileBody(file[0]);
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
entity.addPart("Image", bin1);
post.setEntity(entity);
HttpResponse response;
try {
response = client.execute(post);
resEntity = response.getEntity();
final String response_string = EntityUtils.toString(resEntity);
if(resEntity != null){
Log.i("RESPONSE", response_string);
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
只需调用服务器上的服务文件,即可发送图像,很快就会显示描述和所有内容。
这是我的 C#服务代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Xml;
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
public class Service1 : IService1
{
#region vars
XmlDocument doc = new XmlDocument();// Create the XML Declaration, and append it to XML document
XmlElement root;
#endregion
public Stream GetImage(string path)
{
FileStream stream = File.OpenRead(@System.Web.Hosting.HostingEnvironment.MapPath("~/attachments/test/") + "SrvTest.jpg");
WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";
return stream as Stream;
}
public XmlDocument UpImage(string path, Stream filecontents)
{
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", null, null);
doc.PreserveWhitespace = true;
doc.AppendChild(dec);// Create the root element
root = doc.CreateElement("UpImage");
doc.AppendChild(root);
XmlElement xml_item;
xml_item = doc.CreateElement("Response");
Image img = System.Drawing.Image.FromStream(filecontents);
img.Save(System.Web.Hosting.HostingEnvironment.MapPath("~/attachments/test/") + "SrvTest.jpg", ImageFormat.Jpeg);
XmlElement item;
item = doc.CreateElement("Success");
item.InnerText = "Success";
xml_item.AppendChild(item);
return doc;
}
}
这应该接受我的文件并返回一个带有SUCCESS的XML供我记录。 再次,非常感谢任何帮助!
答案 0 :(得分:1)
假设服务正常运行,您的问题可能在于WCF将一个MIME标头添加到流的开头。
这意味着收到的字节数似乎比发送的字节数长。
我找到了一个很好的例子: http://www.ideatoappster.com/android-to-wcf-streaming-multi-part-binary-images/ 在标题下: WTF?!当我在WCF中读取Stream时,我的二进制数据包含的字节数多于从Android发送时
答案 1 :(得分:1)
假装您的应用是加载到IE中的常见html表单,并准确发送该表单将发送的内容。这样,您就可以使用简单的测试表单测试服务器组件。
首先,编写一个简单的html表单,将图像提交给您的服务。使用type属性设置为“file”的input元素,并确保为元素命名,而不仅仅是id ...
一旦您确认html表单成功发布,您就会知道问题出在Android客户端代码中。
如果问题出在您的Android代码中,请检查正文的内容。看到它不是null等,然后检查是否正确设置了Content-Type和Content-Disposition标头。
如果所有上述测试都通过,请检查帖子的边界线。几年前我几乎被这个问题两次出轨了。 (看不见的字符数。)
以下是一个很好的例子:Uploading image to server in Multipart along with JSON data in Android
虽然它有不同的后端(Java),但http规则是相同的。
布兰登