jersey 文件上传-使用两种不同的方式


在该文档中,我将带领大家使用基于JAX-RS REST风格的实现Jersey来上传文件到服务器制定的文件夹,如果是图片并读取显示出该图片。


准备工作:
  1. 准备一个form表单,有两个字段,一个是type="file"和type="text",并且表单需要使用POST方式提交。注意改表单需要使用multipart/form-data
  2. 该项目使用netbeans8.0和glassfish4.0开发和运行。并且使用maven管理该工程;
  3. 需要在您的C盘建立一个文件夹,用来存储上传的文件。如C:\Newsportal\article_images
开发环境:
1 创建工程 在你项目空白处右键-》点击新建项目

            

2 在创建的项目中选择maven-》点击右侧web应用程序


3 填写工程的名字和maven的组ID和包名


4 选择该项目的运行环境为服务器Glassfish server

5 最后点击完成

准备搭建jersey的运行环境:

1 配置maven需要依赖包,maven的pom文件依赖如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.vi8</groupId>
    <artifactId>jerseyUploadDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>jerseyUploadDemo</name>
    <description>
	jersey上传文件DMEO
    </description>
    <properties>
	<endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
	<!-- Jersey -->
	<dependency>
	    <groupId>org.glassfish.jersey.core</groupId>
	    <artifactId>jersey-server</artifactId>
	    <version>2.0</version>
	    <type>jar</type>
	    <scope>provided</scope>
	</dependency>
	<dependency>
	    <groupId>org.glassfish.jersey.ext</groupId>
	    <artifactId>jersey-mvc-jsp</artifactId>
	    <version>2.0</version>
	    <type>jar</type>
	    <scope>provided</scope>
	</dependency>
	<dependency>
	    <groupId>org.glassfish.jersey.media</groupId>
	    <artifactId>jersey-media-json-jackson</artifactId>
	    <version>2.0</version>
	    <type>jar</type>
	    <scope>provided</scope>
	</dependency>
	<!-- 上传文件需要该依赖-->
	<dependency>
	    <groupId>org.glassfish.jersey.media</groupId>
	    <artifactId>jersey-media-multipart</artifactId>
	    <version>2.0</version>
	    <scope>provided</scope>
	</dependency>
	<!-- 这个用于上传文件工具操作-->
	<dependency>
	    <groupId>commons-io</groupId>
	    <artifactId>commons-io</artifactId>
	    <version>2.4</version>
	</dependency>
	
	<dependency>
	    <groupId>javax</groupId>
	    <artifactId>javaee-web-api</artifactId>
	    <version>7.0</version>
	    <scope>provided</scope>
	</dependency>
    </dependencies>

    <build>
	<plugins>
	    <plugin>
		<groupId>org.apache.maven.plugins</groupId>
		<artifactId>maven-compiler-plugin</artifactId>
		<version>3.1</version>
		<configuration>
		    <source>1.7</source>
		    <target>1.7</target>
		    <compilerArguments>
			<endorseddirs>${endorsed.dir}</endorseddirs>
		    </compilerArguments>
		</configuration>
	    </plugin>
	    <plugin>
		<groupId>org.apache.maven.plugins</groupId>
		<artifactId>maven-war-plugin</artifactId>
		<version>2.3</version>
		<configuration>
		    <failOnMissingWebXml>false</failOnMissingWebXml>
		</configuration>
	    </plugin>
	    <plugin>
		<groupId>org.apache.maven.plugins</groupId>
		<artifactId>maven-dependency-plugin</artifactId>
		<version>2.6</version>
		<executions>
		    <execution>
			<phase>validate</phase>
			<goals>
			    <goal>copy</goal>
			</goals>
			<configuration>
			    <outputDirectory>${endorsed.dir}</outputDirectory>
			    <silent>true</silent>
			    <artifactItems>
				<artifactItem>
				    <groupId>javax</groupId>
				    <artifactId>javaee-endorsed-api</artifactId>
				    <version>7.0</version>
				    <type>jar</type>
				</artifactItem>
			    </artifactItems>
			</configuration>
		    </execution>
		</executions>
	    </plugin>
	</plugins>
    </build>
</project>
2 配置web.xml用以支持jersey,配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <filter>
	<filter-name>JerseyFilter</filter-name>
	<filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
	<init-param>
	    <param-name>javax.ws.rs.Application</param-name>
	    <!--MyApplication.java jersey加载-->
	    <param-value>com.vi8.upload.MyApplication</param-value>
	</init-param>
	<init-param>
	    <param-name>jersey.config.servlet.filter.staticContentRegex</param-name>
	    <param-value>/(img|css|js|font)/.*</param-value>
	</init-param>
	<init-param>
	    <param-name>jersey.config.servlet.filter.forwardOn404</param-name>
	    <param-value>true</param-value>
	</init-param>
	<init-param>
	    <param-name>jersey.config.server.mvc.templateBasePath.jsp</param-name>
	    <param-value>/WEB-INF/pages</param-value>
	</init-param>
    </filter>
    <filter-mapping>
	<filter-name>JerseyFilter</filter-name>
	<url-pattern>/*</url-pattern>
    </filter-mapping>
    <welcome-file-list>
	<welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>
3 编写上面web.xml用到的MyApplication.java 如下:

package com.vi8.upload;

import javax.ws.rs.ApplicationPath;
import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.mvc.jsp.JspMvcFeature;

/**
 * qq: 845885222@qq.com
 *
 * @author Administrator
 */
@ApplicationPath("/")
public class MyApplication extends ResourceConfig {

    public MyApplication() {
	packages("com.vi8.upload.resources");
	register(JspMvcFeature.class);
	register(JacksonFeature.class);
	register(MultiPartFeature.class);
    }
}
以上步骤基本就是jersey运行环境准备工作,接下开始讨论文件如何上传的。

jersey文件上传:

1 文件上传的Resource类,你可以理解是spring mvc中控制器。UploadImageResource.java清单代码

package com.vi8.upload.resources;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import org.apache.commons.io.FileUtils;
import org.glassfish.jersey.media.multipart.ContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataBodyPart;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataMultiPart;
import org.glassfish.jersey.media.multipart.FormDataParam;

/**
 * qq : 845885222
 *
 * @author Administrator
 */
@Path("upload")
public class UploadImageResource {

    /**
     * Constants operating with images
     */
    private static final String ARTICLE_IMAGES_PATH = "c:/Newsportal/article_images/";
    private static final String JPG_CONTENT_TYPE = "image/jpeg";
    private static final String PNG_CONTENT_TYPE = "image/png";

    /**
     * 第一种方式上传
     *
     * @param fileInputStream
     * @param disposition
     * @return
     */
    @POST
    @Path("uploadimage1 ")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public String uploadimage1(@FormDataParam("file") InputStream fileInputStream,
	    @FormDataParam("file") FormDataContentDisposition disposition) {
	String imageName = Calendar.getInstance().getTimeInMillis()
		+ disposition.getFileName();

	File file = new File(ARTICLE_IMAGES_PATH + imageName);
	try {
	    //使用common io的文件写入操作
	    FileUtils.copyInputStreamToFile(fileInputStream, file);
	    //原来自己的文件写入操作
	    //saveFile(fileInputStream, file);
	} catch (IOException ex) {
	    Logger.getLogger(UploadImageResource.class.getName()).log(Level.SEVERE, null, ex);
	}

	return "images/" + imageName;
    }

    /**
     * *
     * 第二种方式上传 使用FormDataMultiPart 获取表单数据
     *
     * @param form
     * @param response
     * @return
     * @throws UnsupportedEncodingException
     */
    @POST
    @Path("uploadimage2")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Produces(MediaType.APPLICATION_JSON)
    public String uploadimage2(FormDataMultiPart form, @Context HttpServletResponse response) throws UnsupportedEncodingException {
	//获取文件流
	FormDataBodyPart filePart = form.getField("file");
	//获取表单的其他数据
	FormDataBodyPart usernamePart = form.getField("username");

	//ContentDisposition headerOfFilePart = filePart.getContentDisposition();
	//把表单内容转换成流
	InputStream fileInputStream = filePart.getValueAs(InputStream.class);

	FormDataContentDisposition formDataContentDisposition = filePart.getFormDataContentDisposition();

	String source = formDataContentDisposition.getFileName();
	String result = new String(source.getBytes("ISO8859-1"), "UTF-8");

	System.out.println("formDataContentDisposition.getFileName()result " + result);

	String filePath = ARTICLE_IMAGES_PATH + result;
	File file = new File(filePath);
	System.out.println("file " + file.getAbsolutePath());
	try {
	    //保存文件
	    FileUtils.copyInputStreamToFile(fileInputStream, file);
//	saveFile(fileInputStream, file);
	} catch (IOException ex) {
	    Logger.getLogger(UploadImageResource.class.getName()).log(Level.SEVERE, null, ex);
	}
	System.out.println("" + "images/" + result);

	response.setCharacterEncoding("UTF-8");
	return "images/" + result;
    }

    /**
     *
     * 不从web服务器去读图片,在磁盘某个目录的文件可以通过流的方式去获取 ,通过 response.getOutputStream()放回数据
     *
     * @param imageName image-name
     * @param type extension of image
     * @param response {@link HttpServletResponse}
     * @throws IOException
     */
    @GET
    @Path("/images/{name}.{type}")
    public void showImg(@PathParam("name") String imageName,
	    @PathParam("type") String type,
	    @Context HttpServletResponse response)
	    throws IOException {
	System.out.println("showImg");
	try (InputStream in = new FileInputStream(ARTICLE_IMAGES_PATH
		+ imageName + "." + type)) {
	    FileUtils.copyFile(new File(ARTICLE_IMAGES_PATH + imageName + "." + type), response.getOutputStream());
//	    FileCopyUtils.copy(in, response.getOutputStream());
	}
    }

    // 保存文件信息到磁盘 
    private void saveFile(InputStream uploadedInputStream, File file) {
	System.out.println("------saveFile-----");
	try {
	    OutputStream outpuStream = new FileOutputStream(file);
	    int read = 0;
	    byte[] bytes = new byte[1024];
//	    outpuStream = new FileOutputStream(new File(serverLocation));
	    while ((read = uploadedInputStream.read(bytes)) != -1) {
		outpuStream.write(bytes, 0, read);
	    }
	    outpuStream.flush();
	    outpuStream.close();
	} catch (IOException e) {
	    e.printStackTrace();
	}
    }
}

2 当然要测试你也许还需要准备一个带有form表单的jsp文件

<form action="${pageContext.request.contextPath}/upload/uploadimage2" method="post" enctype="multipart/form-data">
		<p>
		    文件 :<input type="file" name="file"/><br />
		    用户名: <input type="text" name="username"/><br />
		</p>
		<input type="submit" value="上传" />
	    </form>

3 测试输入http://localhost:8080/jerseyUploadDemo/

结果如下


最后贴上测试代码 在测试代码中会上面列出的有点出入.主要是显示使用Viewable 实现:

1 代码托管在此:

https://github.com/wangko27/jerseyUploadDemo

2 如果不用github你也可以来这儿下载 http://download.csdn.net/detail/wk313753744/8751943

3 当然如果下载链接失效,你还可以加入qq群: 438394076 讨论


  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值