Java Webファイルをアップロードしてダウンロードします。
39588 ワード
ファイルのアップロードはウェブサイトにとって重要性は言うまでもない。今日はJava Web方式で実現されたファイルのアップロードとダウンロードの小例を共有します。プロジェクト依存 プロジェクトディレクトリ ワークフロー ファイルアップロード フォームにおける設定 サーバ端末 アップロード機能の実現 uplloadjsp message jsp UploadHandleServlet webxml構成 結果展示 ファイル閲覧 ListFileServletjava listfiles jsp webxml構成 スクリーンショット結果 注意 パス問題 JSTLは を使用します。テンプレート変数 ファイルのダウンロード Down LoadServletjava webxml構成 スクリーンショット を示す。
総括 プロジェクト依存
この小さい例はJava WebのJSP+Servletを用いて実現される。他にもいくつかの第三者のjarカバンを使用しています。以下を列挙します これらの依存はいずれも容易に得られる。もちろん私の
プロジェクトディレクトリ
プロジェクトを始める前に、プロジェクトリストを提供することで、私たちの考えがより明確になります。
仕事の流れ
新米にとって。web.xmlの配置については、頭が読めないかもしれませんので、図を描いてみます。
Created with Rapha a l 2.10 URLリンクはurl-patternによって同じクラスのservlet-nameを見つけました。servlet-nameによって親タグservlet-mappingを取得して、servlet-mappingの兄弟ノードservletを取得して、servlet-mappingのservletの名前のタイトルに従って、同じ名前のタイトルのservlet-nameを取得することができます。servletタグからservlet-class属性の値を取得し、それを反射技術によりtomcat容器にそれぞれのクラスをロードする。一連の業務論理操作を行う。取得したデータをjspページテンプレートユーザに転送してビューを取得します。
ファイルアップロード
コードを始める前に、私たちはもっと基礎的な知識を知る必要があります。ちょっとうるさいと思うかもしれませんが、これらを知らない子供用の靴の世話をするために、もっと話しましょう。
フォームの設定
ファイルをアップロードする機能を作るには、フォームで行う必要があります。ですから、私たちはルールを守る必要があります。
サーバ端
フォームによるアップロードは便利ですが、ファイル以外のフォームはどうなりますか?この時には、
はい、以下からアップロード機能の実現を開始します。
uplload.jsp
ソフトウェアを使用する過程で、ユーザーにより友好的なユーザー体験を提供するために、ユーザーと一方的に対話する(簡単なヒント機能)ページを追加しました。コードプロセスを伝えるために必要な情報。
ファイル一覧
ダウンロード機能を実現するには、まずユーザーを指導する必要があります。それは私たちのウェブサイトに何がありますか?だから、私たちはウェブサイトにダウンロードのフォルダを提供したいです。
考えは以下の通りです
Created with Rapha_l 2.10は、upladフォルダに位置し、サービスロジックをservletで完成させ、ファイル情報を格納したMapセットを取得し、JSPページにセットして展示します。ユーザーはページビューを獲得します。
ListFileServlet.java
注意
ここにはいくつかの間違いがあります。注意が必要です。
パスの問題
JSTL使用
JSTLラベルライブラリを使う時は、関連のjarバッグを導入することを忘れないでください。その後、JSPページの上に該当する声明を記入します。あと、URI属性は間違えないようにしてください。
テンプレート変数
ファイルのダウンロード
ファイルのダウンロード機能自体は難しくないです。コアはブラウザのheaderに何かを教えて、フロー操作でダウンロードするデータをクライアントブラウザに送信すればいいです。
Down LoadServlet.java
締め括りをつける
最後にプロジェクト全体のまとめについて。
最後に、皆さんが見終わったら、何か収穫がありますように。自分のウェブサイトの機能を更に豊かにさせます。
完全なプロジェクトのダウンロード住所は以下の通りです。https://github.com/guoruibiao/File_Upload_Download/です。いらっしゃいませ
この小さい例はJava WebのJSP+Servletを用いて実現される。他にもいくつかの第三者のjarカバンを使用しています。以下を列挙します
apache-commons-fileupload.jar
+apache-commons-io.jar
:オープンソースのセットが使いやすいコンポーネントjstl.jar
+standard.jar
:テンプレート言語jspで使用されるサポートstringutil.jar
:これは私が自分で書いたstringに対する簡単な操作jarです。ダウンロードhttps://github.com/guoruibiao/File_Upload_Download/blob/master/WebContit/WEB-INF/lib/strigutils.jar repository
で直接に入手することもできます。住所は以下の通りですhttps://github.com/guoruibiao/File_Upload_Download/blob/master/WebContent/WEB-INF/lib。プロジェクトディレクトリ
プロジェクトを始める前に、プロジェクトリストを提供することで、私たちの考えがより明確になります。
仕事の流れ
新米にとって。web.xmlの配置については、頭が読めないかもしれませんので、図を描いてみます。
Created with Rapha a l 2.10 URLリンクはurl-patternによって同じクラスのservlet-nameを見つけました。servlet-nameによって親タグservlet-mappingを取得して、servlet-mappingの兄弟ノードservletを取得して、servlet-mappingのservletの名前のタイトルに従って、同じ名前のタイトルのservlet-nameを取得することができます。servletタグからservlet-class属性の値を取得し、それを反射技術によりtomcat容器にそれぞれのクラスをロードする。一連の業務論理操作を行う。取得したデータをjspページテンプレートユーザに転送してビューを取得します。
ファイルアップロード
コードを始める前に、私たちはもっと基礎的な知識を知る必要があります。ちょっとうるさいと思うかもしれませんが、これらを知らない子供用の靴の世話をするために、もっと話しましょう。
フォームの設定
ファイルをアップロードする機能を作るには、フォームで行う必要があります。ですから、私たちはルールを守る必要があります。
<form
action="${pageContext.request.contextPath }/servlet/UploadHandleServlet"
enctype="multipart/form-data" method="post">
:<input type="text" name="username"><br> 1:<input
type="file" name="file1"><br> 2:<input type="file"
name="file2"><br> <input type="submit" value=" ">
</form>
このフォームを例にとると、私たちは見つけにくくないです。enctype="multipart/form-data"
この行のコードは、サーバに伝える役割を果たしています。このフォームはファイルアップロード処理に使用されます。サーバ端
フォームによるアップロードは便利ですが、ファイル以外のフォームはどうなりますか?この時には、
apache-commons-fileupload
のファイル処理について理解したいです。
try {
// Apache
// 1、 DIskFileItemFactory
DiskFileItemFactory factory = new DiskFileItemFactory();
// 2、
ServletFileUpload uploadparser = new ServletFileUpload(factory);
// 3、 ;
uploadparser.setHeaderEncoding("UTF-8");
if (!ServletFileUpload.isMultipartContent(request)) {
// ,
return;
}
// 4、 ServletFileUpload , List<File> , Item
List<FileItem> files = uploadparser.parseRequest(request);
for (FileItem fileitem : files) {
// fileitem
if (fileitem.isFormField()) {
String name = fileitem.getFieldName();
//
String value = fileitem.getString("UTF-8");
System.out.println(name + " = " + value);
} else {// fileitem ,
String filename = fileitem.getName();
System.out.println(fileitem);
if (filename == null || filename.trim().equals("")) {
continue;
}
// : , , 。 ,
filename = StringUtils.getFileName(filename);
// fileitem
InputStream is = fileitem.getInputStream();
//
FileOutputStream fos = new FileOutputStream(savePath + "\\" + filename);
//
byte[] buffer = new byte[1024];
//
int len = 0;
while ((len = is.read(buffer)) > 0) {
//
fos.write(buffer, 0, len);
}
is.close();
fos.close();
fileitem.delete();
message = new String("Upload Success!".getBytes(), "UTF-8");
}
}
} catch (Exception e) {
message = new String("Upload Failed!".getBytes(), "UTF-8") + e;
e.printStackTrace();
}
アップロード機能の実現はい、以下からアップロード機能の実現を開始します。
uplload.jsp
<%@ 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> </title>
</head>
<body>
<form action="${pageContext.request.contextPath }/servlet/UploadHandleServlet" enctype="multipart/form-data" method="post">
:<input type="text" name="username"><br> 1:<input type="file" name="file1"><br> 2:<input type="file" name="file2"><br> <input type="submit" value=" ">
</form>
</body>
</html>
message.jspソフトウェアを使用する過程で、ユーザーにより友好的なユーザー体験を提供するために、ユーザーと一方的に対話する(簡単なヒント機能)ページを追加しました。コードプロセスを伝えるために必要な情報。
<%@ 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> </title>
</head>
<body>${message }
</body>
</html>
UploadHandleServletpackage controller;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import stringutil.StringUtils;
public class UploadHandleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UploadHandleServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
// , WEB-INF
// String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
String savePath = "E://Code/jee/File_upload_download/WebContent/WEB-INF/upload";
File file = new File(savePath);
//
if (!file.exists() && !file.isDirectory()) {
System.out.println(savePath + " Need to Make Directory named ‘upload’!");
//
file.mkdir();
}
//
String message = "";
try {
// Apache
// 1、 DIskFileItemFactory
DiskFileItemFactory factory = new DiskFileItemFactory();
// 2、
ServletFileUpload uploadparser = new ServletFileUpload(factory);
// 3、 ;
uploadparser.setHeaderEncoding("UTF-8");
if (!ServletFileUpload.isMultipartContent(request)) {
// ,
return;
}
// 4、 ServletFileUpload , List<File> , Item
List<FileItem> files = uploadparser.parseRequest(request);
for (FileItem fileitem : files) {
// fileitem
if (fileitem.isFormField()) {
String name = fileitem.getFieldName();
//
String value = fileitem.getString("UTF-8");
System.out.println(name + " = " + value);
} else {// fileitem ,
String filename = fileitem.getName();
System.out.println(fileitem);
if (filename == null || filename.trim().equals("")) {
continue;
}
// : , , 。 ,
filename = StringUtils.getFileName(filename);
// fileitem
InputStream is = fileitem.getInputStream();
//
FileOutputStream fos = new FileOutputStream(savePath + "\\" + filename);
//
byte[] buffer = new byte[1024];
//
int len = 0;
while ((len = is.read(buffer)) > 0) {
//
fos.write(buffer, 0, len);
}
is.close();
fos.close();
fileitem.delete();
message = new String("Upload Success!".getBytes(), "UTF-8");
}
}
} catch (Exception e) {
message = new String("Upload Failed!".getBytes(), "UTF-8") + e;
e.printStackTrace();
}
request.setAttribute("message", message);
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
web.xml設定<servlet>
<servlet-name>UploadHandleServlet</servlet-name>
<servlet-class>controller.UploadHandleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadHandleServlet</servlet-name>
<url-pattern>/servlet/UploadHandleServlet</url-pattern>
</servlet-mapping>
結果の展示ファイル一覧
ダウンロード機能を実現するには、まずユーザーを指導する必要があります。それは私たちのウェブサイトに何がありますか?だから、私たちはウェブサイトにダウンロードのフォルダを提供したいです。
考えは以下の通りです
Created with Rapha_l 2.10は、upladフォルダに位置し、サービスロジックをservletで完成させ、ファイル情報を格納したMapセットを取得し、JSPページにセットして展示します。ユーザーはページビューを獲得します。
ListFileServlet.java
package controller;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import stringutil.StringUtils;
/** * Servlet implementation class ListFileServlet */
@WebServlet("/ListFileServlet")
public class ListFileServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/** * @see HttpServlet#HttpServlet() */
public ListFileServlet() {
super();
// TODO Auto-generated constructor stub
}
/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
//
String uploadPath = "E://Code/jee/File_upload_download/WebContent/WEB-INF/upload";
//
Map<String, String> filenameMap = new HashMap<String, String>();
// filePath , Map
listFile(new File(uploadPath), filenameMap);
// ,
request.setAttribute("filenameMap", filenameMap);
request.getRequestDispatcher("/listfiles.jsp").forward(request, response);
}
public void listFile(File file, Map<String, String> filenameMap) {
// file ,
if (!file.isFile()) {
//
File[] files = file.listFiles();
// files[]
for (File f : files) {
//
listFile(f, filenameMap);
}
} else {
// strigutil ,
String realName = StringUtils.getFileName(file.getName());
try {
filenameMap.put(new String(file.getName().getBytes("iso8859-1"),"UTF-8"), realName);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
listfiles.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML>
<html>
<head>
<title> </title>
</head>
<body>
<!-- Map -->
<c:forEach var="me" items="${filenameMap}">
<c:url value="/servlet/DownLoadServlet" var="downurl">
<c:param name="filename" value="${me.key}"></c:param>
</c:url>
${me.value}<a href="${downurl}">Download now?</a>
<br />
</c:forEach>
</body>
</html>
web.xml設定<servlet>
<servlet-name>ListFileServlet</servlet-name>
<servlet-class>controller.ListFileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ListFileServlet</servlet-name>
<url-pattern>/servlet/ListFileServlet</url-pattern>
</servlet-mapping>
スクリーンショットの結果注意
ここにはいくつかの間違いがあります。注意が必要です。
パスの問題
this.getServletContext().getRealPath("/WEB-INF/upload");
を使う過程で問題が発生しましたので、ここでは絶対パスを使っています。自分の状況を自由に選んでください。JSTL使用
JSTLラベルライブラリを使う時は、関連のjarバッグを導入することを忘れないでください。その後、JSPページの上に該当する声明を記入します。あと、URI属性は間違えないようにしてください。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
ですテンプレート変数
<c:forEach>
ラベルの内部で、使用する<c:param name="filename" value="${me.key}"></c:param>
パラメータは必ず間違えないようにしてください。私たちはこの中のname="filename"
属性によって、私たちがダウンロードしたいファイルの情報を一意に確定します。ファイルのダウンロード
ファイルのダウンロード機能自体は難しくないです。コアはブラウザのheaderに何かを教えて、フロー操作でダウンロードするデータをクライアントブラウザに送信すればいいです。
Down LoadServlet.java
package controller;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import stringutil.StringUtils;
/** * Servlet implementation class DownLoadServlet */
@WebServlet("/DownLoadServlet")
public class DownLoadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/** * @see HttpServlet#HttpServlet() */
public DownLoadServlet() {
super();
// TODO Auto-generated constructor stub
}
/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
//
String filename = request.getParameter("filename");
filename = new String(filename.getBytes("iso8859-1"), "UTF-8");
// upload .
String fileSaveRootPath = "E://Code/jee/File_upload_download/WebContent/WEB-INF/upload";
//
// ,
// String filePath =
// findFileSavePathByFileName(filename,fileSaveRootPath);
String filePath = fileSaveRootPath;
//
File file = new File(filePath + "\\" + filename);
//
if (!file.exists()) {
request.setAttribute("message", "The File you want to download doesn't exists!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
return;
}
//
String realname = StringUtils.getFileName(filename);
//
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));
// ,
FileInputStream fis = new FileInputStream(filePath + "\\" + filename);
//
OutputStream os = response.getOutputStream();
//
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) > 0) {
os.write(buffer, 0, len);
}
fis.close();
os.close();
}
private String findFileSavePathByFileName(String filename, String fileSaveRootPath) {
int hashcode = filename.hashCode();
int dir1 = hashcode & 0xf; // 0--15
int dir2 = (hashcode & 0xf0) >> 4; // 0--15
String dir = fileSaveRootPath + "\\" + dir1 + "\\" + dir2;
File file = new File(dir);
if (!file.exists()) {
//
file.mkdir();
}
return dir;
}
/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
web.xml設定<servlet>
<servlet-name>DownLoadServlet</servlet-name>
<servlet-class>controller.DownLoadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DownLoadServlet</servlet-name>
<url-pattern>/servlet/DownLoadServlet</url-pattern>
</servlet-mapping>
スクリーンショット展示締め括りをつける
最後にプロジェクト全体のまとめについて。
apache-commons-fileupload
コンポーネントを使用するのは確かに便利です。フォームにアップロードされたデータをList<fileItem>
にパッケージすることができます。このセットを巡回操作するだけで、自分の必要な内容を自由に設定できます。最後に、皆さんが見終わったら、何か収穫がありますように。自分のウェブサイトの機能を更に豊かにさせます。
完全なプロジェクトのダウンロード住所は以下の通りです。https://github.com/guoruibiao/File_Upload_Download/です。いらっしゃいませ