核心提示:1.问题描述今天学习spring mvc时用到了一个jersey库,使用该库可以直接把文件上传到tomcat服务器。而在tomcat服务器端不需要写任何响应代码,只需要服务器处于运行状态,文件就可以上...
1.问题描述
今天学习spring mvc时用到了一个jersey库,使用该库可以直接把文件上传到tomcat服务器。而在tomcat服务器端不需要写任何响应代码,只需要服务器处于运行状态,文件就可以上传到服务器中。jersey库是怎么做到的呢?猜测它是通过http协议的put请求将文件上传上去的。为了验证这个想法,我使用tcp协议模拟http协议看能不能将文件上传到tomcat服务器中。
2.环境搭建
2.1服务器端环境搭建
用j2ee版本的eclipse新建一个java web项目ssmImage19,在WebRoot文件夹下新建一个upload文件夹用于存放上传的文件,该文件夹不能为空,不然部署到服务器中之后,空文件有可能会被删除。新建一个tomcat服务器imgServer,并将项目ssmImage19部署到该tomcat服务器中,将Servers项目中imgServer-config目录下的web.xml(注意不是web项目中WebRoot/WEB-INF目录下的web.xml)中的readonly参数设置为false,允许向服务器写数据,否则上传文件时服务器会返回403错误代码。将imgServer的http协议端口改为8002,用默认的8080端口也可以,客户端代码需要与服务端端口保持一致即可。这里,我的tomcat服务器端口是8002,因此客户端也是连接的8002端口。最后,运行服务器imgServer。


2.2客户端环境搭建
新建一个java工程,客户端代码如下:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class UploadFile {
public static void main(String[] args) throws Exception{
//Tomcat服务器的端口是8002
Socket s = new Socket("localhost", 8002);//连接到服务端的端口
OutputStream out = s.getOutputStream();
upload("Chrysanthemum.jpg", "localhost:8002", out);
upload("Desert.jpg", "localhost:8002", out);
upload("Hydrangeas.jpg", "localhost:8002", out);
upload("Jellyfish.jpg", "localhost:8002", out);
upload("Koala.jpg", "localhost:8002", out);
upload("Lighthouse.jpg", "localhost:8002", out);
upload("Penguins.jpg", "localhost:8002", out);
upload("Tulips.jpg", "localhost:8002", out);
InetAddress sa = s.getInetAddress();
String ip = sa.getHostAddress();
sop("Server " + ip + "::" + s.getPort());
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = -1;
len = in.read(buf);
sop(new String(buf, 0, len));
s.close();
}
private static void upload(String fileName, String host, OutputStream out)
throws IOException{
FileInputStream fis = new FileInputStream(fileName);
//模拟http put请求上传文件
String head = "PUT /ssmImage19/upload/" + fileName + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: keep-alive\r\n" +
"Accept: text/html,application/xhtml+xml,application/xml,*/*\r\n" +
"Accept-Encoding: gzip, deflate\r\n" +
"Accept-Language: zh-CN\r\n" +
"Content-Length: " + fis.available() + "\r\n" +
"\r\n";
out.write(head.getBytes());
byte[] buf = new byte[1024];
int len = -1;
while((len = fis.read(buf)) != -1){
out.write(buf, 0, len);
}
fis.close();
}
public static void sop(Object o){
System.out.println(o);
}
}
运行客户端代码,可以顺利将图片文件上传到服务器imgServer中。




