核心提示: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中。

