WebService中文件传输
前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到教程。
WebService處理傳遞普通的信息,還可以傳輸文件,下面介紹WebService是怎么完成文件傳輸?shù)摹?/p>
1、 首先編寫(xiě)服務(wù)器端上傳文件的WebService方法
package com.hoo.service; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream; import javax.activation.DataHandler; /** * <b>function:</b>Axis WebService完成文件上傳服務(wù)器端 * @author hoojo * @createDate Dec 18, 2010 1:16:16 PM * @file UploadFileService.java * @package com.hoo.service * @project AxisWebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class UploadFileService { /** * <b>function:</b>傳遞文件 * @author hoojo * @createDate Dec 18, 2010 1:27:58 PM * @param handler DataHandler這個(gè)參數(shù)必須 * @param fileName 文件名稱(chēng) * @return upload Info */ public String upload(DataHandler handler, String fileName) { if (fileName != null && !"".equals(fileName)) { File file = new File(fileName); if (handler != null) { InputStream is = null; FileOutputStream fos = null; try { is = handler.getInputStream(); fos = new FileOutputStream(file); byte[] buff = new byte[1024 * 8]; int len = 0; while ((len = is.read(buff)) > 0) { fos.write(buff, 0, len); } } catch(FileNotFoundException e) { return "fileNotFound"; } catch (Exception e) { return "upload File failure"; } finally { try { if (fos != null) { fos.flush(); fos.close(); } if (is != null) { is.close(); } } catch (Exception e) { e.printStackTrace(); } } return "file absolute path:" + file.getAbsolutePath(); } else { return "handler is null"; } } else { return "fileName is null"; } } }?
?
上傳方法和我們以前在Web中上傳唯一不同的就是參數(shù)一DataHandler,可以將這類(lèi)看成文件傳輸器,他可以把文件序列化。然后通過(guò)DataHandler可以得到一個(gè)輸入流InputStream,通過(guò)這個(gè)流可以讀到文件的內(nèi)容。其他的操作和普通上傳類(lèi)似。
2、 定制wsdd發(fā)布文件上傳的WebService服務(wù)
?
<?xml version="1.0" encoding="UTF-8"?> <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="UploadFile" provider="java:RPC"> <parameter name="className" value="com.hoo.service.UploadFileService" /> <parameter name="allowedMethods" value="*" /> <parameter name="scope" value="Session" /> <!-- 和服務(wù)器端上傳文件的方法簽名對(duì)應(yīng),參數(shù)也對(duì)應(yīng) --> <operation name="upload" qname="operNS:upload" xmlns:operNS="upload" returnType="rns:string" xmlns:rns="http://www.w3.org/2001/XMLSchema"> <parameter name="handler" type="ns:DataHandler" xmlns:ns="http://www.w3.org/2001/XMLSchema"/> <parameter name="fileName" type="ns:string" xmlns:ns="http://www.w3.org/2001/XMLSchema"/> </operation> <typeMapping qname="hns:DataHandler" xmlns:hns="ns:FileUploadHandler" languageSpecificType="java:javax.activation.DataHandler" serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory" deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </service> </deployment>?
?
上面才xml節(jié)點(diǎn)元素在前面都見(jiàn)過(guò)了,說(shuō)明下operation中的參數(shù),注意要指定參數(shù)類(lèi)型,特別是DataHandler的類(lèi)型,然后就是typeMapping的serializer、deserializer的序列化和反序列化工廠類(lèi)的配置。
3、 用dos命令發(fā)布當(dāng)前WebService
C:\SoftWare\tomcat-5.0.28\tomcat-5.0.28\webapps\AxisWebService\WEB-INF>java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8080/AxisWebService/services/AdminService deployUpload.wsdd
發(fā)布完成后,可以通過(guò)這個(gè)地址查看uploadFile這個(gè)service了
http://localhost:8080/AxisWebService/servlet/AxisServlet
4、 編寫(xiě)客戶(hù)端代碼
?
package com.hoo.client; import java.rmi.RemoteException; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.xml.namespace.QName; import javax.xml.rpc.ParameterMode; import javax.xml.rpc.ServiceException; import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.encoding.XMLType; import org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory; import org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory; /** * <b>function:</b>上傳文件WebService客戶(hù)端 * * @author hoojo * @createDate Dec 18, 2010 1:38:14 PM * @file UploadFileClient.java * @package com.hoo.client * @project AxisWebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class UploadFileClient { public static void main(String[] args) throws ServiceException, RemoteException { String url = "http://localhost:8080/AxisWebService/services/UploadFile"; String fileName = "readMe.txt"; String path = System.getProperty("user.dir") + "\\WebRoot\\" + fileName; System.out.println(path); //這樣就相當(dāng)于構(gòu)造了一個(gè)帶文件路徑的File了 DataHandler handler = new DataHandler(new FileDataSource(path)); Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(url); /** * 注冊(cè)異常類(lèi)信息和序列化類(lèi) ns:FileUploadHandler 和 wsdd 配置文件中的typeMapping中的xmlns:hns="ns:FileUploadHandler" 的對(duì)應(yīng) DataHandler * 和 wsdd 配置文件中的typeMapping中的qname="hns:DataHandler"的DataHandler對(duì)應(yīng) */ QName qn = new QName("ns:FileUploadHandler", "DataHandler"); call.registerTypeMapping(DataHandler.class, qn, JAFDataHandlerSerializerFactory.class, JAFDataHandlerDeserializerFactory.class); call.setOperationName(new QName(url, "upload")); //設(shè)置方法形參,注意的是參數(shù)1的type的DataHandler類(lèi)型的,和上面的qn的類(lèi)型是一樣的 call.addParameter("handler", qn, ParameterMode.IN); call.addParameter("fileName", XMLType.XSD_STRING, ParameterMode.IN); //設(shè)置返回值類(lèi)型,下面2種方法都可以 call.setReturnClass(String.class); //call.setReturnType(XMLType.XSD_STRING); String result = (String) call.invoke(new Object[] { handler, "remote_server_readMe.txt" }); System.out.println(result); } }?
?
至此,文件傳輸就完成了。怎么樣,還不錯(cuò)吧!
如果你用myEclipse進(jìn)行開(kāi)發(fā)的話(huà),運(yùn)行時(shí)可能會(huì)出現(xiàn)以下的錯(cuò)誤:
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
原因是jar包版本不統(tǒng)一,解決方法如下:
刪除Java EE 5 Libraries/javaee.jar/mail里的包有東西.
具體方法如下:
用rar打開(kāi)X:/Program Files/MyEclipse 6.0/myeclipse/eclipse/plugins/com.genuitec.eclipse.j2eedt.core_6.0.1.zmyeclipse601200710/data/libraryset/EE_5/javaee.jar,然后刪除mail,一切就ok了.
?
?
?
總結(jié)
以上是生活随笔為你收集整理的WebService中文件传输的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: [翻译] C# 3.0语言规范 收藏
- 下一篇: 同类型的mapping不上
