我落后于一位 Android 开发人员,他编写了此代码以将图像转换为 base 64 字符串并将其作为 IO.Stream 对象上传到我的 WCF 服务......
HttpPost post = new HttpPost(mUri);
if(mNameValuePairs != null){
// creating multipart entity for sending image files
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
for(int index=0; index < mNameValuePairs.size(); index++) {
if(mNameValuePairs.get(index).getName().equalsIgnoreCase("strmImage")) {
// If the key equals to "_strmImage", use FileBody to transfer the data
/**
* to send image as multipart uncomment this line, currently not used
*/
// entity.addPart(mNameValuePairs.get(index).getName(), new FileBody(new File (mNameValuePairs.get(index).getValue())));
/**
* convert image into byte array
*/
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(mNameValuePairs.get(index).getValue(), options);
options.inSampleSize = MainActivity.calculateInSampleSize(options, //downsampling
300, 300);
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(mNameValuePairs.get(index).getValue(), options);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream); //compress to which format you want.
byte [] byte_arr = stream.toByteArray();
String image_str = Base64.encodeToString(byte_arr, Base64.DEFAULT); //converting to base 64 string
// making the json object and storing it in mPostdata
mPostdata = new JSONStringer().object()
.key("thisImage")
.object()
.key("UserID").value("163")
.key("UserDrugImageID").value("")
//.key("Filename").value(mNameValuePairs.get(index).getValue())
.key("Filename").value("test.jpg")
.key("SetID").value("2ebcbba3-36bb-49ec-8625-43d60fb730ee")
.key("strmImage").value(image_str)
.endObject().toString();
Log.e("", mPostdata);
/**
* to send image as String body uncomment this line, currently not used
*/
// entity.addPart(mNameValuePairs.get(index).getName(), new StringBody(image_str));
/**
* to send image as String body uncomment this line, currently not used
*/
// entity.addPart(mNameValuePairs.get(index).getName(), new ByteArrayBody(byte_arr, mNameValuePairs.get(index).getValue()));
} else {
// Normal string data
entity.addPart(mNameValuePairs.get(index).getName(), new StringBody(mNameValuePairs.get(index).getValue()));
}
}
/**
* setting multipart entity to httppost object, currently not used
*/
// post.setEntity(entity);
StringEntity se = new StringEntity(mPostdata);
se.setContentType("application/json;charset=UTF-8");//text/plain;charset=UTF-8
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"application/json;charset=UTF-8"));
post.setEntity(se);
/* post.setHeader("Accept", "application/json");
post.setHeader("Content-type", "application/json");*/
}
HttpResponse response = client.execute(post);
mServerResponse = EntityUtils.toString(response.getEntity());
我编写了 WCF REST 服务,包括这个接受复杂对象的方法:
<OperationContract()> _
<WebInvoke(Method:="POST", UriTemplate:="drugImage/add", RequestFormat:=WebMessageFormat.Json, responseformat:=WebMessageFormat.Json, BodyStyle:=WebMessageBodyStyle.Wrapped)> _
Function InsertUserDrugImage(ByVal thisImage As dcUserDrugImage) As dcOperationStatus
Public Function InsertUserDrugImage(ByVal thisImage As dcUserDrugImage) As dcOperationStatus Implements AndroidIService.InsertUserDrugImage
在调试期间,我看到这是我发送的对象:
{"thisImage":{"UserID":"163","UserDrugImageID":"","Filename":"test.jpg","SetID":"2ebcbba3-36bb-49ec-8625-43d60fb730ee","strmImage":"iVBORw0KGgoAAAANSUhEUgAAAUAAAADwCAIAAAD+Tyo8AAAAA3NCSVQICAjb4U\/gAAAKh0lEQVR4\nnO3dz24jWRWA8XNO3XI5GTQLHgS2s5mWEHtgCY8AUtS9avEGrIdmpAEheAN4B3azgxdBGk3\/iV23\n7mFR3dWmldieVN3YJ\/5+i1FLk773pFJf7LiTXF2v1\/JQ7q6qNzc3quruD17nPuOyr169GjdafH3m\n34\/59zuH+W3xXQE8GgIGAiNgIDACBgIjYCAwAgYCI2AgMAIGAiNgIDACBgIjYCAwAgYCI2AgMAIG\nAiNgIDACBgIjYCAwAgYCI2AgMAIGAiNgIDACBgIjYCCwdOoBHpu65SY3Pmz1atVbo1nsnZbPiwxV\ndhN3MRcXqfB7icVF1MXGje58G3NxMZVist021hQZpDPtdflfY4wTuLiARcRK6obiaVusTS5Z21bE\nJC++kYq6uEl2ca0TsIqaZN0TsA6DtJtGukFSERdL3rv2Iu3i8+DxXVzAt0m63GwtifaDaXbvsvVN\n0bL8pRi7KpKqBlwk7Qm4LeVda02RosmKiXe3bd+V5T9b4SQuLuDP+rxpZFWkl67t1036TqWIiHlZ\nfC8VdXfz4l4nYHcVNS\/jRne+zbsmdVmKleSb3IjlTqQ0xYblx8EJpFLm3riqWuPgmXFlEfEPFlnz\ntaXrPvdNr0MzNLf\/an\/85u9\/u+ot2\/IBj35x1VVa+b2\/\/mXP\/7zO5bsurbO4Fh2u\/vm733ye9Ta1\nVg5fzxrX\/85dAt0\/d+5ywvn15cuXc\/aYDl+as8ge0+FRSy24GmSbsohkuVpn+dU3X9+uS5dTkX6p\nLc7KoMlcTLJJv7Hu52+\/X7turXM\/6kW7xa\/\/J8LdP584+fxn\/RR6vC7jZ7ilrtG7JKmkTSrmw2BW\n2tJmHbQv530pHiwVuU322Tbl5Oqp8c\/eNLdtMTniVfca1\/8xXcL8aeY7Ni5d7ynEON785\/kTF9HS\nrvs+22ZQE\/de2iTbxp\/m6zomLtpskphIEheRlWQ1K374Q1bj+t+5RaD7584tTjj\/rIedafqq569O\n\/11kzcYl26BS1JO6uFjSrG5H3M8hZZUuF1cTaYoMbr1452Iih+\/pGtd\/V8T7Z9c5zM93YgGBETAQ\nGAEDgREwEBgBA4ERMBAYAQOBETAQGAEDgREwEBgBA4ERMBAYAQOBETAQGAEDgREwEBgBA4ERMBAY\nAQOBETAQGAEDgREwEBgBA4ERMBAYAQOBETAQGAEDgaU5Z7rsnl+63Egf7Z7OtujCqqIiHxd1d6l2\nAuVZ+fCRcpHDH7Jq1\/+9sPfPe+cwvz579uzBG1Q9OUp2LtCyy7qYShYxE\/3Df\/5dxBu1csQNHZT6\neLiZiMjvf\/JTEVFtjjkfuNL1310\/4v2zu\/7J50\/ffvvtgzcYp3\/+\/Hm996HGAcpTwFJcrq\/MzIvL\nBTwAu\/sXX3xhZqXIMacTSuUDrIPeP7uLn3z+WU+hd7epcQSrmU2XZtFnQR+eQtsFVPv\/SinuLmLu\nhz9e1a7\/p6LdP5864fxzj6WfnkVUukBVn6JEPLV9pg\/HvR97Q1e9\/hL8\/pEzmJ9XoYHACBgIjICB\nwAgYCIyAgcAIGAiMgIHACBgIjICBwAgYCIyAgcAIGAiMgIHACBgIjICBwAgYCIyAgcAIGAiMgIHA\nCBgIjICBwAgYCIyAgcAIGAiMgIHACBgIjICBwGYFPJ6MWvX81fFgmHpnI13g8Uhy9Elfj3P9o98\/\np50\/zXnfpg2kzulv0wWSRQ8i8\/fHW\/vH+S\/jgO\/pVpuu6n6Vrv8n84S7fybnML++fPly5h71zl8V\nEVW9ublZ9upM5wOryy\/\/\/I2YmuglHPDt7j97d6uqRx7wLXWu\/66I98+uk88\/6xHY7P1t4e7jn5c1\nnrk6fp5b8PzVj4\/Aoqrq40YXcFbwD30ErnT9J0Hvn8k5zD\/rfODdh\/gadp+i1DCtPGZ8CT58sFSO\neMbxCNc\/+v1z8vl5FRoIjICBwAgYCIyAgcAIGAiMgIHACBgIbNa\/A0c0aFoNRVSyFVdTGbJ0jRT1\nfOrRqmhc3raeymDeaGnVB7HXUq796X\/fykW4uIBFt0Vtk8Q8tYO4aPLimocneinUi3jq+pJTP5iJ\na6+rJCay\/Hcm4fE9zbt2j6tctmarQbJJ45KG7m07dEVUnuYjcG5kNehg0vg2N+KWr3vZNlu+enoa\nLi7g1+3qupfc5Ma3fXIXKzbIYMMTvZ+v++G7ztdZsnYpX4n+V8QGk4YH4Cfh4gK+7sumkVWxja1W\n+eofv\/31n\/749a2u2+N+OucHGb9Rdvxpkko\/zjb9NMx935GbzdLrN8VK8iHbWxt+9H23ue5l4Gvg\nJ+HiAn7Ttl32oreNbPukjdv4ck7R5R+CXVxVi5qqeoUfVxyXLWrjRne+zVUur1elKZZlZYO4FhHq\nfTouLuB1HopKN8htGr8GbjeNNL2a9Yvv5eIqapJV6gQs6uImedzozrcZrKyGtG0kDdvxTda9ufXi\n7eLz4PFdXMCiuahtGuvN1lldUipFpC8VLsXYVZFUNeAiaU\/AIkW86\/Jg+m5r2pRV1tYk8xj8NFxc\nwC7WuIjYahC3vriLd66uVf5ZxVVUpehxP3\/7Q43LqhS5P2BXEdm4yCBtU0SkNLIRv7iP+1P1RF97\nBS4DAQOBETAQGAEDgREwEBgBA4ERMBAYAQOBETAQGAEDgREwENhix4tW8mjHQ1bC\/Hsw\/0EH509z\nTlUbD02rdPTbtMX4PtQ4\/Y35j9mC+fcsfvL59dmzZ\/P3kDqf4Vif9Vn\/wAHfXdc9eOnxc8Pz58+r\n\/sqYr776qtIhjsy\/H\/Pvdw7zp5nv2DR6pc9A0+iVTmFl\/v2Yf7+Tz8+r0EBgBAwERsBAYAQMBEbA\nQGAEDARGwEBgBAwERsBAYAQMBEbAQGAEDARGwEBgBAwERsBAYAQMBEbAQGAEDARGwEBgBAwERsBA\nYAQMBEbAQGAEDARGwEBgBAwERsBAYLMCns4+rHowTKWTqYT5D2H+\/c5h\/lkHfE9Lm1nt96He4sL8\nh7Zg\/j2Ly0nnT3NWf4QTyqti\/tNi\/vnSixcv5vz9Rzt\/dfHFpy2Yf8\/izH9wi9POn0opD95g9wl6\nxPNXmf\/ILYT571\/8tPPzKjQQGAEDgREwEBgBA4ERMBAYAQOBETAQGAEDgREwEBgBA4ERMBAYAQOB\nETAQGAEDgREwEBgBA4ERMBAYAQOBETAQGAEDgREwEBgBA4ERMBAYAQOBETAQGAEDgREwEBgBA4HN\nOh+43qFvk+nwqEqHUy2+5ieYfw\/mP+jg\/KlpmjmrT3+ec8rhfXYv0Jw578P8+zH\/fucwv3755Zdz\n9hjPJjer8lTc3acTyisdo8z8ezD\/QSefX9fr9ZwNVPXm5qbSOeXjsq9evap6gDLz34f59zuH+XkR\nCwiMgIHACBgIjICBwAgYCIyAgcAIGAiMgIHACBgIjICBwAgYCIyAgcAIGAiMgIHACBgIjICBwAgY\nCIyAgcAIGAiMgIHACBgIjICBwAgYCIyAgcAIGAiMgIHACBgIjICBwAgYCIyAgcAIGAgs3dzcPPgv\nX8L5q3Mw\/37Mv98x8\/MIDARGwEBgBAwERsBAYAQMBEbAQGAEDARGwEBgBAwERsBAYAQMBEbAQGAE\nDARGwEBgBAwE9j9cgtl23\/xr3AAAAABJRU5ErkJggg==\n"}
这是 dcUserDrugImage 的数据合同...
<Serializable()> _
<DataContract> _
Public Class dcUserDrugImage
Private _UserDrugImageID As String
Private _UserID As String
Private _SetID As String
Private _url As String
Private _Filename As String
Private _strmImage As Stream
<DataMember(IsRequired:=False)>
Public Property UserDrugImageID() As String
Get
Return _UserDrugImageID
End Get
Set(ByVal value As String)
_UserDrugImageID = value
End Set
End Property
<DataMember(IsRequired:=True)>
Public Property UserID() As String
Get
Return _UserID
End Get
Set(ByVal value As String)
_UserID = value
End Set
End Property
<DataMember(IsRequired:=True)>
Public Property SetID() As String
Get
Return _SetID
End Get
Set(ByVal value As String)
_SetID = value
End Set
End Property
<DataMember(IsRequired:=True)>
Public Property Filename() As String
Get
Return _Filename
End Get
Set(ByVal value As String)
_Filename = value
End Set
End Property
<DataMember(IsRequired:=False)>
Public Property url() As String
Get
Return _url
End Get
Set(ByVal value As String)
_url = value
End Set
End Property
<DataMember(IsRequired:=True)>
Public Property strmImage() As Stream
Get
Return _strmImage
End Get
Set(ByVal value As Stream)
_strmImage = value
End Set
End Property
Public Sub New()
End Sub
Public Sub New(ByVal thisDrugImage As UserDrugImage)
_UserDrugImageID = thisDrugImage.UserDrugImageID
_UserID = thisDrugImage.UserID
_SetID = thisDrugImage.SetID
_url = thisDrugImage.url
_Filename = thisDrugImage.ImageFileName
End Sub
Public Overrides Function ToString() As String
Dim sb As New StringBuilder
sb.Append("User ID: ")
If Not UserID = Nothing Then
sb.Append(UserID)
Else
sb.Append("null")
End If
sb.Append(", SetID: ")
If Not UserID = Nothing Then
sb.Append(SetID)
Else
sb.Append("null")
End If
sb.Append(", Filename: ")
If Not UserID = Nothing Then
sb.Append(Filename)
Else
sb.Append("null")
End If
sb.Append(", Size of Image Stream: ")
If Not strmImage Is Nothing Then
sb.Append(strmImage.Length.ToString)
Else
sb.Append("0")
End If
Return sb.ToString
End Function
End Class
<System.Runtime.Serialization.KnownType(GetType(dcUserDrugImage))> _
<CollectionDataContract()>
Public Class dcDrugImageCollection
Inherits List(Of dcUserDrugImage)
End Class
我现在得到的错误是:
The server encountered an error processing the request.
The exception message is 'Cannot create an abstract class.'.
See server logs for more details. The exception stack trace is: </p>
<p> at system.Runtime.Serialization.FormatterServices.nativeGetUninitializedObject(RuntimeType type)...
整天都在用头撞墙,尝试了 39485783475 种不同的东西,只是要休息一下,希望你们中的一个人能看到一些东西 :)