基于Java中两种jersey文件上传方式

前端技术 2023/09/01 Java

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

准备工作:准备一个form表单,有两个字段,一个是type=\"file\"和type=\"text\",并且表单需要使用POST方式提交。注意改表单需要使用multipart/form-data。该项目使用netbeans8.0和glassfish4.0开发和运行。并且使用maven管理该工程;需要在您的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; 

@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> 

结果如下

以上就是本文的全部内容,希望对大家实现jersey文件上传有所帮助。

本文地址:https://www.stayed.cn/item/2824

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。