[英]Encoding base64 in Java and decoding in C#
我必須將文件發送到我的webservice,但webservice假定文件(字節數組)為base64Binary。
在編碼之前,byteArrayFile作為常規文件保存在磁盤上。 (我這樣做只是為了測試)
所以,在我的webservice的Java客戶端中,我用這種方式發送信息:
String file = new sun.misc.BASE64Encoder().encode(byteArrayFile);
port.sendFileToWebService(file);
Web服務必須解碼信息並將接收的文件保存在磁盤上。
[WebMethod]
public string sendFileToWebService(string file)
{
string dirname = HttpContext.Current.Request.PhysicalApplicationPath + "\\Attachments\\";
if (!System.IO.Directory.Exists(dirname))
{
System.IO.Directory.CreateDirectory(dirname);
}
string filename = dirname + "/" + "file.sim";
WebClient myWebClient = new WebClient();
myWebClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
byte[] byteArray = null;
byteArray = Convert.FromBase64String(file.Replace("\n", ""));
byte[] responseArray = myWebClient.UploadData(filename, "POST", byteArray);
return "Webservice says OK";
}
問題是:
保存在磁盤上的文件(編碼前)和使用C#解碼的文件不等於。 我不知道這是Java編碼或C#解碼的問題。
任何建議,包括更改文件類型或邏輯過程,將始終是值得贊賞的。
提前致謝!
編輯 - 文件比較:
原始文件http://img819.imageshack.us/img819/820/originalu.png
解碼文件(在Java編碼之后)http://img826.imageshack.us/img826/3184/processed.png
我知道XSD標准指定了一個名為base64Binary的數據類型。 這應該允許的是,你的[WebMethod]
參數是一個byte[]
。 然后底層服務棧將字節數組編碼為base64字符串。
例如,我剛剛做了這樣的快速Java服務
@WebMethod(operationName = "TestByteArray")
public void testByteArray(byte[] data) {
}
生成的WSDL的相關部分如下所示:
<operation name="TestByteArray">
<input wsam:Action="jordan.services/EncodingTests/TestByteArrayRequest" message="tns:TestByteArray"/>
<output wsam:Action="jordan.services/EncodingTests/TestByteArrayResponse" message="tns:TestByteArrayResponse"/>
</operation>
和
<xs:complexType name="TestByteArray">
<xs:sequence>
<xs:element name="arg0" type="xs:base64Binary" nillable="true" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
我也在.Net做了一個測試:
[WebMethod]
public void testByteArray(byte[] bytes) {
}
生成的WSDL的相關部分:
<wsdl:portType name="TestWSSoap">
<wsdl:operation name="testByteArray">
<wsdl:input message="tns:testByteArraySoapIn"/>
<wsdl:output message="tns:testByteArraySoapOut"/>
</wsdl:operation>
</wsdl:portType>
和
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
<s:element name="testByteArray">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="bytes" type="s:base64Binary"/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="testByteArrayResponse">
<s:complexType/>
</s:element>
</s:schema>
</wsdl:types>
嘗試使用普通文件i / o而不是WebClient
public string sendFileToWebService(string file)
{
string dirname = HttpContext.Current.Request.PhysicalApplicationPath + "\\Attachments\\";
if (!System.IO.Directory.Exists(dirname))
{
System.IO.Directory.CreateDirectory(dirname);
}
string filename = dirname + "/" + "file.sim";
byte[] byteArray = Convert.FromBase64String(file);
File.WriteAllBytes(filename, byteArray ); //might wanna catch exceptions that could occur here
return "Webservice says OK";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.