项目中为了实现服务器间的文件传输,开始使用URL类来获取文件流,后来遇到中文问题,无论如何找不到文件.无奈之下改用webService实现
1.webService服务端程序:
package com.webservice;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 用于发送公告附件文件
*
*/
public class SendFile extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = -1569160986493044411L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String path = this.getClass().getResource("").getPath();
path = path.substring(1, path.indexOf("/server"));
// 附件存在位置
String filePath = path + "/bin/BulletinDir";
String infoID = request.getParameter("infoID");
String saveName = request.getParameter("saveName");
saveName = new String(saveName.getBytes("iso-8859-1"), "gbk");
File file = new File(filePath + "/" + infoID + "/" + saveName);
FileInputStream fis = new FileInputStream(file);
//
ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
byte[] b = new byte[4096];
int n = -1;
while ((n = fis.read(b)) != -1) {
baos.write(b, 0, n);
}
fis.close();
baos.close();
// 存放文件的字节数组
byte[] ret = baos.toByteArray();
//
System.out.println(filePath + "/" + infoID + "/" + saveName);
ObjectOutputStream out = new ObjectOutputStream(response.getOutputStream());
out.writeObject(ret);
out.flush();
out.close();
}
}
2.web.xml配置
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<!-- 配置过滤webService请求 -->
<servlet>
<servlet-name>sendFile</servlet-name>
<servlet-class>com.webservice.SendFile</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sendFile</servlet-name>
<url-pattern>/annotation</url-pattern>
</servlet-mapping>
</web-app>
3.客户端调用程序:
// 在本地生成的文件
java.io.File file_gl = new java.io.File(strAbsPath + "/page_dir/" + infoID + "/" + saveName);
// 服务端服务地址及端口
String serverIp = "127.0.0.1:8080";
//调用webservice生成文件
try {
// 请求的远程URL
String path = "http://" + serverIp + "/annotation";
String pa = path + "?infoID=" + infoID + "&saveName=" + saveName;
URL url = new URL(pa);
URLConnection connection = url.openConnection();
InputStream is = connection.getInputStream();
ObjectInputStream objInStream = new ObjectInputStream(is);
// 取得信息
byte[] fileByte = (byte[]) objInStream.readObject();
FileOutputStream fos = new FileOutputStream(file_gl);
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write(fileByte);
bos.flush();
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
这样就完成了两台服务器通信的问题,不用在为中文问题困扰
注:开始净文件写入输出流,后来发现,写入的其实只是一个文件路径,并没有真正的将文件写入。之后改用现在的,将文件内容存入字节数据,(为什么不存入其他文件流呢,因为文件流是不可序列化的,不能被webService写入),最后将字节数据传输过去,大功告成!