java web文件上傳與下載-------(想學習的就來看看)

一、筆記

在這裏插入圖片描述
2.
在這裏插入圖片描述
3. 文件上傳步驟
在這裏插入圖片描述
3.1 一些方法
在這裏插入圖片描述
在這裏插入圖片描述
3.2
在這裏插入圖片描述
文件下載:
1.
在這裏插入圖片描述
1.1
在這裏插入圖片描述

二、擼代碼

文件上傳代碼:
servlet

package cn.lixuquan.fileUPload;
/**
 * 需求:
 * 學習文件上傳
 */
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;

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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * Servlet implementation class FileUpLoad
 */
@WebServlet("/FileUpLoad")
public class FileUpLoad extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//響應中文亂碼問題
		response.setContentType("text/html;charset=utf-8");
		//1.創建文件上傳工廠對象
		DiskFileItemFactory factory = new DiskFileItemFactory();
		//1.1通過工廠對象設置臨時文件
		File f = new File("d:\\Temp");
		if(!f.exists())
		{
			f.mkdirs();
		}
		factory.setRepository(f);
		factory.setSizeThreshold(1024*1024);
		//2.創建解析器對象
		ServletFileUpload fileUpload = new ServletFileUpload(factory);
		//2.1設置字符編碼
		fileUpload.setHeaderEncoding("utf-8");  //處理上傳普通字段,文件名稱的中文亂碼問題
		//3.解析請求對象
		try {
			List<FileItem> fileItems = fileUpload.parseRequest(request);
			//開始遍歷這個表單項
			for(FileItem fileitem: fileItems)
			{
				boolean flag = fileitem.isFormField();
				if(flag)
				{
					//普通表單項
					String name = fileitem.getFieldName();
					if("username".equals(name))
					{
						if(!fileitem.getString().equals(""))
						{
							String value = fileitem.getString("utf-8");
							response.getWriter().print("上傳者:"+value+"<br>");
						}
					}
				}
				else
				{
					//文件上傳的表單項
					String filename = fileitem.getName();
					//處理文件名稱包含路徑的問題
					if(filename != null && !filename.equals(""))
					{
						response.getWriter().print("上傳的文件名稱是:"+filename+"<br>");
						filename = filename.substring(filename.lastIndexOf("\\")+1);
						//處理上傳文件同名的問題
						filename = UUID.randomUUID()+"_"+filename;
						//服務器端 創建同名的文件
						String webPath = "/upload/";
						//把文件名稱和服務端的文件組合在一起
						String filePath = getServletContext().getRealPath(webPath+filename);
						//創建文件夾
						File file = new File(filePath);
						file.getParentFile().mkdirs();
						file.createNewFile();
						//獲取文件的字節輸入流
						InputStream is = fileitem.getInputStream();
						//獲取一個輸出流
						FileOutputStream os = new FileOutputStream(file);
						int len = 0;
						byte[] buffer = new byte[1024];
						while((len=is.read(buffer)) > 0)
						{
							os.write(buffer, 0, len);
						}
						//關閉流
						os.close();
						is.close();
						//刪除臨時文件
						fileitem.delete();
						response.getWriter().print("文件上傳成功"+"<br>");
					}
				}
			}
		} catch (FileUploadException 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);
	}
}

jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上傳</title>
</head>
<body>
<form action="/servletPractice/FileUpLoad" method="post" enctype="multipart/form-data">&nbsp;:<input type="text" name="username" /><br>&nbsp;:<input type="password" name="password"/><br>
文件上傳&nbsp;:<input type="file" name="file" /><br>
<input type="submit" value="提交">
</form>
</body>
</html>

注意: 表單裏必須加enctype=“multipart/form-data”,不然上傳的只是文件名,沒有內容。


文件下載代碼
servlet

package cn.lixuquan.fileUPload;
/**
 * 需求:文件下載
 */

import java.io.IOException;
import java.io.InputStream;
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;

/**
 * Servlet implementation class DownloadServlet
 */
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//1.處理響應中文亂碼問題
		response.setContentType("text/html;charset=utf-8");
		//2.獲取下載的文件名稱,由於下載和上傳的fileupload的jar包沒有一毛錢關係,所以使用request的一些相關方法
		String filename = request.getParameter("filename");
		//處理get請求的中文亂碼問題
		filename = new String(filename.getBytes("iso-8859-1"),"utf-8");
		//3.獲取文件的mime類型(這裏你可以簡單的理解爲文件的後綴名)
		String fileType = getServletContext().getMimeType(filename);
		String name=DownUtils.filenameEncoding(filename, request);
		//4.設置兩個頭
		response.addHeader("Content-Type",fileType);
		response.addHeader("Content-Disposition", "attachment;filename="+name);
		//5.文件的下載
		String folder = "/download/";
		//5.1獲取文件的字節輸入流
		InputStream is = getServletContext().getResourceAsStream(folder+filename);
		//5.2獲取文件的字節輸出流
		OutputStream os = response.getOutputStream();
		int len = 0;
		byte[] buffer = new byte[1024];
		while((len=is.read(buffer)) != -1)
		{
			
			os.write(buffer, 0, len);
		}
		//關閉流
		os.close();
		is.close();
	}

	/**
	 * @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);
	}
}

jsp代碼:

<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件下載</title>
</head>
<body>
<a href="downloadServlet?filename=1.jpg">文件下載</a>
<br>
<a href="downloadServlet?filename美女.jpg">文件下載</a>
</body>
</html>

DownUtil代碼

package com.zch.upload;

import sun.misc.*;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletRequest;

public class DownUtils {
	public static String filenameEncoding(String filename, HttpServletRequest request) throws UnsupportedEncodingException {
		// 獲得請求頭中的User-Agent
		String agent = request.getHeader("User-Agent");
		// 根據不同的客戶端進行不同的編碼

		if (agent.contains("MSIE")) {
			// IE瀏覽器
			filename = URLEncoder.encode(filename, "utf-8");
		} else if (agent.contains("Firefox")) {
			// 火狐瀏覽器
			BASE64Encoder base64Encoder = new BASE64Encoder();
			filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
		} else {
			// 其它瀏覽器
			filename = URLEncoder.encode(filename, "utf-8");
		}
		return filename;
	}
}

三、分享與交流

最後有興趣一起交流的,可以關注我的公衆號:這裏你能夠學到很實用的技巧,不是常用的我不說,公衆號回覆提取碼即可獲取以下學習資料啦啦啦啦,喜歡就拿去吧!!

(鏈接時常會失效,若出現此類情況,可以加我微信:17722328325(加時請備註:學習資料))

  1. Java web從入門到精通電子書

  2. Python機器學習電子書

  3. Python400集(北京尚學堂)

  4. JavaScript項目案例、經典面試題

  5. Java300集(入門、精通)

  6. Java後端培訓機構錄集(同事培訓內部提供)

  7. java重要知識pdf文檔(價值連城呀呀,不收藏你會後悔的)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章