XFire中进行文件上传

首先是web.xml和services.xml

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>XFireServlet</servlet-name> <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> <!-- 上面的是web.xml的内容 --> <!-- 下面的是services.xml的内容 --> <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://xfire.codehaus.org/config/1.0"> <service> <name>XFireUploadDemo</name> <namespace>http://www.jadyer.com/XFireUploadDemo</namespace> <serviceClass>com.jadyer.server.FileUpload</serviceClass> <implementationClass>com.jadyer.server.FileUploadImpl</implementationClass> </service> </beans>

然后是服务端暴露的接口极其实现类

package com.jadyer.server; public interface FileUpload { /** * 文件上传 * @param data 待上传文件的字节数组 * @param dest 上传的目的地路径 * @param fileName 自定义文件名 * @return String 上传成功则返回"OK",否则返回"Error:******"错误信息 * @see 本例中需要用到commons-fileupload和commons-io组件 */ public String upload(byte[] data, String dest, String fileName); } /** * Web服务端暴露的接口及其实现类 */ package com.jadyer.server; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class FileUploadImpl implements FileUpload { public String upload(byte[] data, String dest, String fileName) { if (null == data || 0 == data.length) { return "Error: 待上传文件的字节数组为空"; } if (null == dest || "" == dest) { return "Error: 上传的目的地路径为空"; } if (null == fileName || "" == fileName) { return "Error: 自定义文件名为空"; } if (-1 == fileName.lastIndexOf(".")) { return "Error: 自定义的文件名未指定后缀"; } ByteArrayInputStream in = null; // 文件输入流 BufferedInputStream bin = null; // 输入缓冲流 OutputStream out = null; // 输出流 BufferedOutputStream bout = null; // 输出缓冲流 try { // 得到字节数组输入流 in = new ByteArrayInputStream(data); // 得到输入缓冲流 bin = new BufferedInputStream(in); // 验证目的地路径 File folderSave = new File(dest); if (!folderSave.isDirectory()){ folderSave.mkdirs(); // 如果上传的目的地路径不存在,则新建目录 } // 验证目标文件 File fileSave = new File(dest + "/" + fileName); if (fileSave.exists()) {// 当目标路径下已存在该文件时 if (!fileSave.canWrite()){ return "Error:文件不可写入"; } } else if (!fileSave.createNewFile()){ return "Error:文件无法新建"; } // 得到输出流 out = new FileOutputStream(fileSave); // 得到输出缓冲流 bout = new BufferedOutputStream(out); /** * 循环 */ int intByte = 512 * 1024; // 缓冲区大小 byte[] fileData = new byte[intByte]; // 定义一个缓冲区 int intIndex = 0; while (-1 != (intIndex=bin.read(fileData, 0, intByte))) { bout.write(fileData, 0, intIndex); bout.flush(); } folderSave = null; fileSave = null; } catch (IOException e) { return ("Error:" + e.getMessage()); } finally { if (in != null) { try { in.close(); in = null; } catch (IOException e) { e.printStackTrace(); } } if (bin != null) { try { bin.close(); bin = null; } catch (IOException e) { e.printStackTrace(); } } if (out != null) { try { out.close(); out = null; } catch (IOException e) { e.printStackTrace(); } } if (bout != null) { try { bout.close(); bout = null; } catch (IOException e) { e.printStackTrace(); } } } return "OK"; } }

服务端代码至此完毕

下面是客户端的代码

对于客户端,我们又创建了一个Web Project,以便于与Web服务端的项目进行区分

这里客户端的代码生成,我们换一种方式:使用XFire提供的Eclipse插件

插件的安装说明,请参见:http://xfire.codehaus.org/Eclipse+Plugin

该插件安装成功后,选择Eclipse——File——New——Other——XFire——Code generation from WSDL document

然后在弹出的窗口中,对三个参数进行设置一下就可以了

WSDL URL or path: 可以输入Web服务方提供的WSDL地址,也可以选择Web服务方提供的WSDL文件

Output direectory: 选择客户端项目,至src节点,如/XFire_Upload_client/src,其中XFire_upload_client是我建立的客户端工程名字

Package: 选择客户端工程中已建好的,用于存放将要生成的客户端代码的包

最后点击Finish即可

注意:此时需要在客户端中,引入MyEclipse6.5提供的XFire 1.2 Core、HTTP Client、JAXB2 Libraries

接下来是两个JSP页面,分别用来上传文件和处理文件上传操作的

<%@ page pageEncoding="GBK"%> <form name="upload" action="upload.jsp" method="POST" enctype="multipart/form-data"> <table> <tr> <th>上传文件</th> </tr> <tr> <td><input type="file" name="file"></td> </tr> <tr> <td><input type="submit" value="上传"></td> </tr> </table> </form>

<%@ page pageEncoding="GBK"%> <%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%> <%@ page import="org.apache.commons.fileupload.FileItemFactory"%> <%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%> <%@ page import="java.util.List"%> <%@ page import="org.apache.commons.fileupload.FileItem"%> <%@ page import="com.jadyer.client.XFireUploadDemoClient"%> <%@ page import="com.jadyer.client.XFireUploadDemoPortType"%> <% FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List fileItems = upload.parseRequest(request); FileItem item = (FileItem)fileItems.get(0); byte[] fileBytes = item.get(); System.out.println("---------------------------------------------------------"); System.out.println("上传的文件名称:" + item.getName()); System.out.println("原始的文件名称:" + item.getName().substring(item.getName().lastIndexOf("//") + 1)); System.out.println("上传的文件大小:" + item.getSize()); System.out.println("文件的字节长度:" + fileBytes.length); System.out.println("文件的MINI类型:" + item.getContentType()); System.out.println("item.getFieldName:" + item.getFieldName()); System.out.println("---------------------------------------------------------"); XFireUploadDemoClient client = new XFireUploadDemoClient(); XFireUploadDemoPortType service = client.getXFireUploadDemoHttpPort(); //参数:文件的字节数组,上传目的地路径,文件名称 String returnValue = service.upload(fileBytes,"D://test",item.getName().substring(item.getName().lastIndexOf("//") + 1)); //打印返回值 System.out.println("returnValue = " + returnValue); %>

最后上传成功的文件,会保存在D:/test/目录下  ^_^   ^_^

你可能感兴趣的:(String,upload,null,import,web服务)