1. 程式人生 > >jersey 檔案上傳-使用兩種不同的方式

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: [email protected]
 *
 * @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>

結果如下


最後貼上測試程式碼 在測試程式碼中會上面列出的有點出入.主要是顯示使用Viewable 實現:

1 程式碼託管在此:

3 當然如果下載連結失效,你還可以加入qq群: 438394076 討論

相關推薦

Java上帝之眼系列配置Spring專案檔案方式(全解析)

歡迎檢視Java開發之上帝之眼系列教程,如果您正在為Java後端龐大的體系所困擾,如果您正在為各種繁出不窮的技術和各種框架所迷茫,那麼本系列文章將帶您窺探Java龐大的體系。本系列教程希望您能站在上帝

jersey 檔案-使用不同方式

在該文件中,我將帶領大家使用基於JAX-RS REST風格的實現Jersey來上傳檔案到伺服器制定的資料夾,如果是圖片並讀取顯示出該圖片。 準備工作: 準備一個form表單,有兩個欄位,一個是type="file"和type="text",並且表單需要使用POST方式

頭像截圖方式(SWFUpload、一個簡單易用的flash外掛)

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http:

php圖片方式base64與file

首先介紹大家熟知的form表單提交(file)方式: <!DOCTYPE html> <html> <head> <meta charset="UTF-

使用 awk 生產表的不同方式

使用 awk 生產表的兩種不同方式 awk 可以用於解決重複性高的任務,核心在於使用 awk 來批量的生成需要的表。這裡的表既可以是特定的格式設定,如圖形介面中的 style ,也可以是程式碼或者其它。 這裡我以圖形介面中的 style 為例。 當我需要對多個功能不同,操作方

不同方式解決八皇后問題

問題描述 八皇后問題是一個以國際象棋為背景的問題:如何能夠在8×8的國際象棋棋盤上放置八個皇后,使得任何一個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。 解決思路 這個問題可以有兩種解決方法,一種是使用遞

PHP二維數組合並的不同方式

第一種合併方式:        通過PHP的陣列API給出的array_merge方法來合併一個數組    程式碼: $a = array(array("1","2"),array("

檔案方法對比

檔案上傳 這裡參考阮一峰老師的部落格,原文寫於2012年,現在需要不斷學習新東西。 早期不同檔案上傳瀏覽器相容性不好。現在HTML5出現後有了統一的介面。 1、早期 form 表單同步上傳 <form id="upload-form" action="upload.ph

springMVC檔案以及用ajax方式提交

spring mvc上傳檔案的簡單例子,這有幾個需要注意的地方 1.form的enctype=”multipart/form-data” 這個是上傳檔案必須的 2.需要依賴的jar包(網上找) 具體程式碼: 1.spring的配置檔案 1)spring

kafka0.8版本和sparkstreaming整合的不同方式

最近研究了不同kafka版本和sparkstreaming整合時的區別,整理如下 1- kafka-0.8.2以上kafka-0.10以下 一種是基於receiver的,一種是沒有receiver的,兩種不同的方式有不同的程式設計模型、效能特徵

java 位運算中移動位數超過資料長度和右移的不同方式

記錄 java 位運算中的兩點注意事項:移動位數超過資料長度和右移的兩種不同方式。 int、long型別資料移動等於或超過最大位數 在 java 中,int 型別的資料長度為 32 位,如果將 int 型別左移或者右移大於或等於 32 位時,並不會像預計

fastDFS+LibreOffice多檔案(二)後端部分:檔案資訊轉json字串儲存資料庫(Gson和org.json方式)

需要注意的地方: 1)如果你複製我的程式碼到你的程式上報錯,可以看看我第一篇文章實體類跟配置檔案的設定:https://blog.csdn.net/qq_36688143/article/details/84162924 第二篇檔案上傳前端頁面的程式碼: https://blog.c

AspNetCore 檔案(模型繫結、Ajax) 方式 get到了嗎?

就目前來說,ASP.NET Core2.1了,已經相當成熟了,希望下個專案爭取使用吧!! 上傳檔案的三種方式("我會的,說不定還有其他方式") 模型繫結 Ajax WebUploader 一。模型繫結   官方機器翻譯的地址:https://docs.microsoft.com/en-us

springmvc和servlet下的檔案和下載(存檔案目錄和存資料庫Blob方式

專案中涉及了檔案的上傳和下載,以前在struts2下做過,今天又用springmvc做了一遍,發現springmvc封裝的特別好,基本不用幾行程式碼就完成了,下面把程式碼貼出來: FileUpAndDown.jsp <%@ page language="java"

Java檔案方式(uploadify和Spring預設方式

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ include file="../jsp/include/taglibs.jsp"%> <!DOCTY

C# webapi 檔案流 stream 方式《第一部分 檔案流》

 部落格僅用於記錄工作學習中遇到的坑,歡迎交流! 1.檔案流 1.1 客戶端 從上傳元件中獲取InputStream,轉換為byte[],組裝物件上傳 try{ byte[] buffer = new byte[filedata.InputStream.Le

java檔案方式的一些問題

接觸到一個專案,一個java web專案,據說是十幾年的寫的程式碼,現在打算做新版本,先要我們專案組解決一下就版本程式碼裡面的bug,以便現在的日常使用。 主要的bug是檔案上傳失敗 打斷點跟蹤了一下,發現了問題:SpringMVC中servletFileUpload.p

檔案的幾方式

一、springmvc中的檔案上傳 1.配置檔案 (1).pom檔案,檔案上傳主要需要如下幾個jar包 <dependency> <groupId>org.springframework</groupId>

web 檔案的幾方式

問題 檔案上傳在WEB開發中應用很廣泛。 檔案上傳是指將本地圖片、視訊、音訊等檔案上傳到伺服器上,可以供其他使用者瀏覽或下載的過程。 以下總結了常見的檔案(圖片)上傳的方式和要點處理。 表單上傳 這是傳統的form表單上傳,使用form表單的input[type=”file”]控制元

HTML5 檔案的2方式

以前上傳檔案需要提交Form表單。 HTML5方式上傳檔案,可以通過使用FormData類模擬Form表單提交,從而實現無重新整理上傳檔案。 假設有一個檔案選擇框 <input type="file" name="pic" id="pic" accept="i