import org.glassfish.jersey.servlet.ServletContainer;import javax.ws.rs.Path;import org.eclipse.jetty.server.Server;import org.eclipse.jetty.servlet.FilterHolder;import org.eclipse.jetty.servlet.ServletContextHandler;import org.eclipse.jetty.servlet.ServletHolder;import org.eclipse.jetty.servlets.CrossOriginFilter;/** * 功能:服务启动 * @author yuchong.shen * 2019年1月10日 * */@Path("/")public class RestInterface { private void start(int port) throws Exception { //设置扫描包及配置multipart ServletHolder servletHolder = new ServletHolder(ServletContainer.class); servletHolder.setInitParameter("jersey.config.server.provider.packages","yuchongshen.uploader"); servletHolder.setInitParameter("jersey.config.server.provider.classnames","org.glassfish.jersey.media.multipart.MultiPartFeature"); //servlet上下文 ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); servletContextHandler.addServlet(servletHolder, "/*"); //解决前端跨域访问问题 FilterHolder filterHolder = new FilterHolder(CrossOriginFilter.class); filterHolder.setInitParameter("allowedOrigins", "*"); filterHolder.setInitParameter("allowedMethods", "GET, POST"); servletContextHandler.addFilter(filterHolder, "/*", null); //创建服务 Server server = new Server(Config.PORT); server.setHandler(servletContextHandler); server.start(); System.out.println("******************************************************************"); System.out.println("server has startup,port:"+Config.PORT); System.out.println("server has startup,upload path:"+Config.UPLOAD_PATH); System.out.println("******************************************************************"); } public static void main(String[] args) throws Exception { int portIndex=0,uploadPathIndex=0; for(int i=0;i<args.length;i++){ if(args[i].equals("-uploadpath")) uploadPathIndex=i+1;//获取上传路径根目录 if(args[i].equals("-port")) portIndex=i+1;//获取端口号 } if(uploadPathIndex>0) Config.UPLOAD_PATH = args[uploadPathIndex]; if(portIndex>0) Config.PORT = Integer.parseInt(args[portIndex]); RestInterface server = new RestInterface(); server.start(Config.PORT); }
import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import javax.inject.Singleton;import javax.ws.rs.Consumes;import javax.ws.rs.POST;import javax.ws.rs.Path;import javax.ws.rs.WebApplicationException;import javax.ws.rs.core.MediaType;import org.glassfish.jersey.media.multipart.FormDataContentDisposition;import org.glassfish.jersey.media.multipart.FormDataParam;/** * 功能:处理上传 * @author yuchong.shen * 2019年1月10日 * */@Path("/upload")@Singletonpublic class Uploader { @POST @Consumes({MediaType.MULTIPART_FORM_DATA}) public String uploadFile(@FormDataParam("file") InputStream fileInputStream, @FormDataParam("file") FormDataContentDisposition fileMetaData, @FormDataParam("path") String path, @FormDataParam("file_name") String fileName) throws Exception { String postfix = fileMetaData.getFileName().substring(fileMetaData.getFileName().lastIndexOf(".")); if(fileName==null){ fileName = new String(fileMetaData.getFileName().getBytes("iso8859-1"),"utf-8"); }else{ fileName = fileName+postfix; } if(path==null) path = ""; try { int read = 0; byte[] bytes = new byte[1024]; OutputStream out = new FileOutputStream(new File(Config.UPLOAD_PATH+File.separatorChar +path+ File.separatorChar+fileName)); while ((read = fileInputStream.read(bytes)) != -1) { out.write(bytes, 0, read); } out.flush(); out.close(); } catch (IOException e) { throw new WebApplicationException(); } return "uploaded successfully"; }}
<properties> <jersey2.version>2.19</jersey2.version> <jaxrs.version>2.0.1</jaxrs.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-server</artifactId> <version>9.4.14.v20181114</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-servlets</artifactId> <version>9.4.14.v20181114</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-servlet</artifactId> <version>9.4.14.v20181114</version> </dependency> <!-- JAX-RS --> <dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>${jaxrs.version}</version> </dependency> <!-- Jersey 2.19 --> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> <version>${jersey2.version}</version> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-server</artifactId> <version>${jersey2.version}</version> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>${jersey2.version}</version> </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-multipart</artifactId> <version>2.19</version> </dependency> </dependencies>
maven打包执行
mvn package
进入target目录执行:
java -jar uploader-0.0.1-SNAPSHOT.jar
服务启动完毕,默认端口为8888,上传根目录为jar包所在目录
启动时带参数,例如:
java -jar target/uploader-0.0.1-SNAPSHOT.jar -port 8777 -uploadpath C:\Users\yuchongshen\
http://ip:端口/upload
前端使用post方法mulitpart/form_data
参数名 | 类型 | 描述 |
file | File | 上传的文件 |
path | String | 上传在根目录下的哪个目录,必须事先创建 |
file_name | String | 上传文件改名 |