javaEE文件上傳代碼解析和完整解釋以及報錯解決方法

🥇🥈🥉一、首先把上傳的相關jar導入:
在這裏插入圖片描述

🈺🉐獲取Commons-FileUpload組件的方式下載地址:
1、Commons-FileUpload組件:
Commons-FileUpload組件類庫:commons-fileupload-1.2.2.jar
Commons-FileUpload組件的API文檔: apidocs
下載Commons-IO組件:
2、Commons-IO組件:
Commons-IO組件類庫:commons-io-2.4.jar
Commons-IO組件的API文檔: commons-io-2.4\docs
🔥🌞二、下載步驟詳情:
javaEE文件上傳代碼如何下載相關jar包步驟

三、完整代碼和註釋如下:🌈㊙
1、uploading.jsp代碼:

<%@ page  language="java" contentType="text/html; charset=utf-8"  pageEncoding="utf-8" %>
<html>
<head>
<title>上傳jsp文件</title>
<style type="text/css">
.father-scroll{
        overflow-y: scroll;
        width: 200px;
        height: 100px;
    }
    .theme-scroll{
        overflow-y: scroll;
        width: 50px;
        height: 20px;
    }
   /*  .theme{
    height: 20px;
    width: 20px;} */
}

</style>

</head>

<body>

   
<!-- 問題三:1、注意action,from的跳轉路徑與繼承HttpServlet,與之匹配@WebServlet(value = "/upload")
      2、如果from表單中有需要上傳的文件,則需要添加enctype="multipart/form-data",而且必須method="post" -->
   <form action="upload" enctype="multipart/form-data" method="post">
    <table class="tb" border="0" cellspacing="5" cellpadding="0">
        <thead>
            <tr><td align="center" colspan="2" class="text_tabledetail2">增加新聞</td></tr>
        </thead>
        <tbody>
            <tr>
                <td class="text_tabledetail2">主題</td>
                <td>
                <!-- 列出所有的新聞分類 -->
                    <select name="theme">
                        <option value="國內">國內</option>
                        <option value="國際">國際</option>
                        <option value="娛樂">娛樂</option>
                        <option value="軍事">軍事</option>
                        <option value="財經">財經</option>
                        <option value="天氣">天氣</option>
                    </select>
                </td>
            </tr>
            <tr>
                <td class="text_tabledetail2">標題</td>
                <td><input type="text" name="title" value=""/></td>
            </tr>
            <tr>
                <td class="text_tabledetail2">作者</td>
                <td><input type="text" name="author" value=""/></td>
            </tr>
            
            <tr>
                <td class="text_tabledetail2">摘要</td>
                <td><textarea id="summary" name="digest" rows="8" cols="50"></textarea></td>
            </tr>
            <tr>
                <td class="text_tabledetail2">內容</td>
                <td>
                <div id="xToolbar"></div>
                <textarea id="newscontent" name="content" class="ckeditor" rows="10" cols="60"></textarea>
                </td>
            </tr>
            <tr>
                <td class="text_tabledetail2">上傳圖片: </td>
                
                <td>
                <input type="text" disabled="disabled" id="show"/>
 <!-- 問題一:爲什麼input設置value值無法顯示? -->
 <!--好像不行,用 JavaScript/VBScript 也不能設置,應該是因爲安全原因。例如,如果你用的是 Window NT,
                賬戶數據庫存放路徑(好像在)X:\WinNT\SYSTEM32 下的某個文件,如 NTLMDB.SYS(忘記叫什麼名字了)。
                這時你瀏覽某個黑客頁面,表面上他讓你選擇你要上傳的文件,但是當 FORM 提交時,
                黑客的 JavaScript 把 FILE 的路徑設爲 X:\WINNT\SYSTEM32\NTLMDB.SYS,這樣黑客就無形之中吧這個極其重要的文件上傳到他的服務器上,
                然後他就可以破解你的機器上的各個用戶的密碼(我知道有這樣的工具)。 -->
                <input type="file" name="nfile" value="瀏覽..." onchange="change(this.value)"/>
                </td>
            </tr>
            <tr>
                <td style="text-align:center;" colspan="2">
                    <button type="submit" class="page-btn" name="save">保存了</button>
                    <button type="reset" class="page-btn" name="save">重置</button>
                </td>
            </tr>
        </tbody>
    </table>
   </form>
    <!-- 問題二:爲什麼JavaScript用onclick方法不可以,把選擇文件的文件名放在input裏面,而是需要用onchange -->
   <!-- //使用onchange而非onclick,onclick會在彈出框出現之前,而onchange會在選擇完文件後 -->
   <script type="text/javascript">
  

	function change(src){
	  
	  document.getElementById("show").value = src;
  
   }
   </script>
   
</body>
</html>

2、Uploading.jsp代碼:

package net.hnjdzy.Uploading;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;

/*import java.util.List;
import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.FileUploadException;*/


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



@WebServlet(value = "/upload")
public class UploadServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");//設置頁面編碼
		String uploadFileName = "";//上傳的文件名
		String fieldName = "";//表單字段元素的name屬性值;
		//ServletFileUpload.isMultipartContent(request);解釋:
		//在得到上傳文件之前,首先要判斷客戶端<form>標記的enctype屬性是否是“multipart/form-data"。
		//也可以說是判斷是普通表單,還是帶文件上傳的表單。文件上傳的表單值不能按普通表單接收值那樣直接獲取。
		boolean isMultipart = ServletFileUpload.isMultipartContent(request);
		//request.getSession().getServletContext() 獲取的是Servlet容器對象,相當於tomcat容器了。getRealPath("/")
		//獲取實際路徑,“/”指代項目根目錄,所以代碼返回的是項目在容器中的實際發佈運行的根路徑如:
		//I:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\UMPWeb_20131230\
		//上傳文件的存儲路徑(服務器文件系統上的絕對文件路徑)
		String uploadFilePath  = request.getSession().getServletContext().getRealPath("upload/");
		if(isMultipart) {
		//	1、 構建文件項工廠;磁盤文件項工廠(DiskFileItemFactory)
		FileItemFactory factory = new DiskFileItemFactory();
		//  2、創建ServletFileUpload對象;
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setHeaderEncoding("utf-8");//設置數據頭編碼;
		
		try {
			//3、通過upload來解析form表單中所有文件(解析請求)
			java.util.List<FileItem> items = upload.parseRequest(request);
			//4、獲取所有的輸入流;迭代器(iterator)
			Iterator<FileItem> iterator = items.iterator();
			while(iterator.hasNext()) { //依次處理每一個文件;
				FileItem item = iterator.next();
				if(item.isFormField()) {//判斷是否爲普通表單字段,如果fileitem中封裝的是普通輸入項的數據
					fieldName = item.getFieldName();//獲取表單字段的name屬性值;
                    String value = item.getString("UTF-8");//解決普通輸入項的數據的中文亂碼問題
					
					if(fieldName.equals("theme")) {//判斷表單字段name是否爲“theme”
						//輸出表單字段的值;
						System.out.println("主題爲:"+item.getString("UTF-8")+"上傳了文件。");
					}
					if(fieldName.equals("title")) { //判斷表單字段name是否爲“title”
						//輸出表單字段的值;
						System.out.println("標題爲:"+item.getString("UTF-8")+"上傳了文件。");
					}
					if(fieldName.equals("author")) { //判斷表單字段name是否爲“author”
						//輸出表單字段的值;
						System.out.println("作者爲:"+item.getString("UTF-8")+"上傳了文件。");
					}
					if(fieldName.equals("digest")) { //判斷表單字段name是否爲“digest”
						//輸出表單字段的值;
						System.out.println("摘要爲:"+item.getString("UTF-8")+"上傳了文件。");
					}
					if(fieldName.equals("content")) { //判斷表單字段name是否爲“content”
						//輸出表單字段的值;
						System.out.println("內容爲:"+item.getString("UTF-8")+"上傳了文件。");
					}
				}else {//文件表單字段,fileitem中封裝的是上傳文件
					String fileName = item.getName(); //得到上傳的文件名稱,
					if(fileName!=null && !fileName.equals("")) {
					//String fileName = (new File(fileItem.getName())).getName();
					//fileItem.getName()獲得上傳時文件名,
					//new File(fileItem.getName()) 通過文件名獲得一個文件對象,
					//(new File(fileItem.getName())).getName();調用文件對象的getName()方法,獲得不帶路徑的文件名。
						File fullFile = new File(item.getName());
						uploadFileName=fullFile.getName();
						File saveFile = new File(uploadFilePath, fullFile.getName());////保存路徑 和名字
						item.write(saveFile);//輸出:輸入的內容
						System.out.println(""+item);//看地址和所用的東西
						System.out.print("上傳成功後的文件名是:"+uploadFileName);
					}
				}
			}
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
		
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doGet(request, response);
	}

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.service(req, resp);
	}

	
	
}

四、報錯情況+解決方法如下🎁💎:
1、寫代碼中導包有錯誤:
(1)報錯圖片如下:
在這裏插入圖片描述
(2)正確和錯誤包如下(記得把錯誤的包改成正確的包哦!):

錯誤的包:
import java.util.List;
import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.FileUploadException;
正確的包:
import java.util.Iterator;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;

2、上傳問題—文件上傳重複(別擔心,這不是錯誤,重新換一個圖片就可以了。)
在這裏插入圖片描述

五、正確輸出圖片展示🌈㊙:
1、頁面展示(已經填寫好內容和選擇好了圖片):
在這裏插入圖片描述
2、控制檯輸出(成功):
在這裏插入圖片描述

六、網站借鑑如下🌈㊙:
https://www.cnblogs.com/liunanjava/p/4261355.html

以上總結,當採納和對你有幫助時;
🤞👣👀👇🤝🙌🍗
留下你的點贊足跡+你愛心的評論哦!
🉐(⓿_⓿)謝啦!!☆⌒(*^-゜)v

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