1. 程式人生 > >基於Servlet3.0+註解開發實現檔案上傳

基於Servlet3.0+註解開發實現檔案上傳

檔案上傳:
   * 要求:
        1.表單的提交方式必須是POST
        2.表單中必須有<input type="file" name="upload"/>標籤,而且該標籤必須有name屬性.
        3.表單的enctype屬性的值,必須為:"multipart/form-data",表單所提交的Servlet上有@MultipartConfig註解表示:     該Servlet處理的是multipart/form-data型別的請求

index.jsp(web介面)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>檔案上傳的頁面</h1>
<!-- 
	* 表單的提交的方式必須是POST.
	* 表單中需要有檔案上傳的表單元素:這個元素這個元素必須有name屬性和值:<input type=”file” name=”upload”>
	* 表單的enctype屬性的值必須是multipart/form-data.
 -->
<form action="${ pageContext.request.contextPath }/UploadServlet" method="post" enctype="multipart/form-data">
	<table border="1" width="600">
		<tr>
			<td>檔案描述</td>
			<td><input type="text" name="desc"></td>
		</tr>
		<tr>
			<td>檔案上傳</td>
			<td><input type="file" name="upload"></td>
		</tr>
		<tr>
			<td colspan="2"><input type="submit" value="上傳"></td>
		</tr>
	</table>
</form>
</body>
</html>

UUIDUtils.java

package com.upload.demo;

import java.util.UUID;

/**
 * 生成隨機字串工具類(通用唯一識別碼)
 * 
 * @author 侯青華
 *
 */
public class UUIDUtils {
	// 私有構造
	private UUIDUtils() {
	}

	// 返回一個識別碼
	public static String getUUID() {
		return UUID.randomUUID().toString().replace("-", ""); // 去掉字串的"-"
	}

	// 返回一個識別碼+"_"+檔名的新檔名(防止上傳檔名重複問題) 例:dasda_aaa.txt
	public static String getUUIDFileName(String fileName) {
		return getUUID() + "_" + fileName;
	}

}

UploadUtils.java

package com.upload.demo;

/**
 * 獲得檔案儲存目錄(根據hashCode計算+位運算生成二級目錄)
 * 
 * @author 侯青華
 *
 */
public class UploadUtils {
	public static String getPath(String uuidFileName) {
		// 使用UUIDUtils生成的唯一檔名.hashCode();
		int code1 = uuidFileName.hashCode();
		int d1 = code1 & 0xf; // 獲得到1級目錄.
		int code2 = code1 >>> 4;
		int d2 = code2 & 0xf; // 獲得到2級目錄.
		return "/" + d1 + "/" + d2; //返回獲得的目錄

	}

}

UploadServlet.java(檔案上傳的Servlet)

package com.upload.demo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

/**
 * 上傳檔案Servlet
 * 
 * @author 侯青華
 * @version 建立時間:2018年3月22日 下午7:40:10
 */
@WebServlet("/UploadServlet") // 設定訪問這個Servlet的路徑
@MultipartConfig // 說明該Servlet處理的是multipart/form-data型別的請求
public class UploadServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	@SuppressWarnings("resource")
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 接收普通資料(解決post方式request中文亂碼)
		request.setCharacterEncoding("utf-8");
		// 解決檔案輸出中文亂碼
		response.setContentType("text/html;charset=utf-8");
		// 接收檔案
		Part part = request.getPart("upload");
		// 獲得檔名
		String header = part.getHeader("Content-Disposition");
		int indx = header.lastIndexOf("filename=\"");
		String fileName = header.substring(indx + 10, header.length() - 1);
		// 獲得檔案輸入流(拿到檔案)
		InputStream is = part.getInputStream();
		// 獲得upload檔案路徑
		String path = this.getServletContext().getRealPath("/upload");
		// 呼叫UUIDUtils獲得唯一檔名
		String uuidFileName = UUIDUtils.getUUIDFileName(fileName);
		// 呼叫UploadUtils獲得路徑(對檔案進行分目錄存放,防止一個目錄中檔案過多)
		String realPath = UploadUtils.getPath(uuidFileName);
		File file = new File(path + realPath);
		if (!file.exists()) {
			// 路徑不存在則建立
			file.mkdirs();
		}
		// 輸出流
		FileOutputStream fos = new FileOutputStream(path + realPath + "/" + uuidFileName);
		byte[] chs = new byte[1024];
		int len;
		while ((len = is.read(chs)) != -1) {
			fos.write(chs, 0, len);
		}
		// 釋放資源
		is.close();
		fos.close();
		response.getWriter().println("檔案上傳成功!");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
        總結: 檔名可以通過獲取當前系統時間毫秒值+檔名的方式. 目錄名也可以建立時間目錄(依據天/周/月均可).依照不同情況進行編碼.

相關推薦

基於Servlet3.0+註解開發實現檔案

檔案上傳:   * 要求:        1.表單的提交方式必須是POST        2.表單中必須有<input type="file" name="upload"/>標籤,而且該標籤必須有name屬性.        3.表單的enctype屬性的值,必須

Servlet3.0 多圖片,檔案

1.分析 上傳檔案的過程:客服端選擇一個檔案後,寫入到伺服器端,伺服器端使用一個目錄來儲存該檔案--底層IO流操作 2.jsp檔案上的表單設計 表單傳輸格式用multipart/form-data,要上傳的檔案input標籤name屬性最好用同樣的字首或者字尾好獲取 <form method="p

[Servlet3.0新特性]Serlvet檔案

Servlet 3.0的另一個新特性就是提供了處理檔案上傳的功能,使用Servlet 3.0的內容實現檔案上傳需要以下幾個內容: 在處理檔案上傳的Servlet上增加@MultipartConfig

@MultipartConfig,Servlet3.0通過Part進行檔案

@MultipartConfig 使用註解@MultipartConfig 將一個 Servlet 標識為支援檔案上傳。Servlet3.0 將 multipart/form-data 的 POST 請

servlet3.0實現檔案

servlet3.0實現檔案上傳功能 必須使用tomcat7以上的技術才能支援servlet3.0 servlet3.0 比 servlet2.5 多提供了三個新特性:   註解開發:方便   檔案上傳:有些api不是特別全   非同步請求:基本不用,使用ajax替代 檔案上傳技術: 1

在Spring MVC框架下利用Servlet3.0 API實現檔案

Servlet3.0提供了對檔案上傳的原生支援,不需藉助任何第三方元件,直接使用Servlet3.0提供的API就能夠實現檔案上傳功能。本文使用IDEA IDE工具,在Spring MVC框架下,基於註解對映和資料繫結編寫Java業務程式碼,利用Servlet3

servlet3.0 註解開發 helloworld

eclips art prot extend end public quic .com tar 使用編輯器為MyEclipse 版本2018 .9 當前版本 老版本 新建一個Servlet 1 package com.xiaou; 2 3 impo

springboot基於MultipartFile實現檔案

MultipartFile是springMVC的jar包,不需要其它座標,可以直接使用 一. 新建controller @RequestMapping("/uploadTest1") public String test1(@RequestParam("

Android Retrofit2.0實現檔案和下載

這篇主要介紹retrofit框架的上傳檔案到伺服器和從伺服器下載功能的實現 上傳檔案到伺服器 首先 retrofit2.0之前上傳檔案到伺服器需要一個叫TypedFile這個類,但是在2.0版本,這個類被取消了,因為2.0以後,retrofit內部集成了okhttp

Jsp+Servlet實現檔案下載——前臺頁面開發

       JSP和Servlet都是J2EE的規範,JSP全名為Java Server Pages,中文名叫java伺服器頁面,它是在傳統的網頁HTML檔案中插入Java程式段(Scriptlet

基於jquery的Ajax實現 檔案

---------------------------------------------------------------遇到困難的時候,勇敢一點,找同學朋友幫忙,找導師求助. Ajax Ajax簡介 AJAX(Asynchronous Javascript And XML)翻譯成中文就是“非同

基於tobato的fastdfs與spring boot整合實現檔案和下載

專案結構: pom.xml檔案新增配置: <!-- fastdfs --> <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastd

nginx基於lua-resty-upload實現檔案

package.path = '/usr/local/openresty/lualib/resty/?.lua;' local upload = require "upload" local chu

如何在基於Java的Web專案中實現檔案和下載?

在Sevlet 3 以前,Servlet API中沒有支援上傳功能的API,因此要實現上傳功能需要引入第三方工具從POST請求中獲得上傳的附件或者通過自行處理輸入流來獲得上傳的檔案,我們推薦使用Apac

由SpringMVC實現檔案,前端基於easyui

後臺控制層的方法參考部落格:http://blog.csdn.net/qciwyy/article/details/54017166 本部落格主要講解前臺方法(基於easyui的easyui-filebox控制元件) 一 .easyui-1.4.0前版本使用方法,在這之前e

如何基於ServiceComb實現檔案功能

檔案上傳,當前支援在vertx rest通道和servlet rest中使用。 檔案上傳使用標準的http form格式,可與瀏覽器的上傳直接對接。 Producer: 支援jaxrs和springmvc開發模式 jaxrs開發模式: 支援servlet定義的j

Servlet 3.0改進的API 實現檔案

1、Servlet 3.0 對檔案上傳的支援 Servlet 3.0 改進了部分API,使得java web 的開發進一步得到簡化。 其中兩個較大的改進是: HttpServletRequest 增加了對檔案上傳的支援 ServletContext 允許

基於html5 websocket API簡單實現斷點檔案

本例項基於html5的 websocket API和netty框架,如果您對兩個技術不太熟悉,可以點選下面連線瞭解 準備: fiefox瀏覽器或chrome瀏覽器 在classpath中匯入netty類庫,json類庫 好拉

iOS開發之結合asp.net webservice實現檔案下載

iOS開發中會經常用到檔案上傳下載的功能,這篇檔案將介紹一下使用asp.net webservice實現檔案上傳下載。 首先,讓我們看下檔案下載。 這裡我們下載cnblogs上的一個zip檔案。使用NSURLRequest+NSURLConnection可以很方便的實現這個功能。 同步下載檔案:

django 快速實現檔案(django2.0)

django2.0 快速實現檔案上傳 本操作環境: 虛擬環境:django2.0 python3.5(應該python3.6都可以使用) window10 1.建立專案與應用(專案和應用都是自己制定的) 建立專案:django-admin star