我正試圖將檔案從本地驅動器(Windows 10)決議到運行在Linux盒子上的服務器。Servlet的版本還不到3.0,所以我使用了Apache FileUpload和IO jars。我在決議檔案時遇到了兩個問題:
。使用<input type = "submit" value = "Upload File" >的提交目前不會提交資料,所以我使用<button id="ok" onclick="document.forms[0].submit(); return false;"> Submit</button> 。
第二個更嚴重的問題是,我無法向List上傳決議過的資料。在我提交表單后,List是空的。我已經注釋了jsp表單中的每一個方法,所以我不應該在Apache上傳之前讀取和決議請求主體(但我不確定如何在我嘗試讀取檔案之前驗證主體是否為空)。我還試著上傳文本而不是檔案(以檢查訪問windows檔案系統時是否有問題),但沒有成功。
也許我錯過了一些明顯的東西。你能不能給我一些提示,如何解決這個問題。謝謝
JSP(舊檔案)<%@ page language="java" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ include file="upload_function.jspf" %>
<%String pageLanguage=getLanguage(request);%>
<%@ MultipartConfig%>
<%@WebServlet("/upload")%>
<html>
<head>
<link rel="styleheet" type="text/css" href="upload.css"> </link>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data" ></form>
<div>
<tr>
<h4>上傳的檔案:</h4>
<%=getLocalImage(request)%>
</tr>
</div>
<div>
<tr>
<label for=""><h4>檔案上傳:</h4></label>
<input type="file" id="image" name="image" accept="image/png, image/jpeg" >
<input type = "submit" value ="Upload File" >
</tr>
</div>
<div>
<tr>
<p>
<按鈕id="ok" onclick="document.forms[0].submit();return false;"> Submit</button>
<按鈕id="取消" onclick="javascript:window.close();return false;"> Ok</button>
</p>
</tr>
</div>
</form>
</body>
</html>
JSPF(舊檔案)
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>
<%@ page import="javax.servlet.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*"/span> %>
<%@ page import="org.apache.commons.fileupload.servlet.*"/span> %>
<%@ page import="org.apache.commons.fileupload.*"/span> %>
<%@ page import="org.apache.commons.io.*"/span> %>
<%!
public String getLocalImage(HttpServletRequest request) throws ServletException, IOException
{
String result = "null"/span>。
String UPLOAD_DIRECTORY = "/final/directory/for/file/upload/"。
//檢查內容
if(ServletFileUpload.isMultipartContent(request)){
try {
//為基于磁盤的檔案專案創建一個工廠。
DiskFileItemFactory factory = new DiskFileItemFactory() 。
//配置一個存盤庫(確保使用一個安全的臨時位置)。
ServletContext servletContext = this.getServletConfig().getServletContext()。
File repository = (File) servletContext.getAttribute("javax.servlet.text.tempdir") 。
factory.setSizeThreshold(40960)。
factory.setRepository(repository)。
//創建一個新的檔案上傳處理器。
ServletFileUpload upload = new ServletFileUpload(factory)。
upload.setSizeMax(2000000)。
//決議請求
try {
List<FileItem> items = upload.parseRequest(request)。
}
catch(Exception ex){
ex.printStackTrace()。
}
//處理上傳的專案。
Iterator<FileItem> iter = items.iterator()。
File uploadedFile = new File(UPLOAD_DIRECTORY, "圖片。 png")。)
// List<FileItem> items is empty - error trying to use the iterator.
FileItem item = iter.next()。
item.write(uploadFile)。
result = "檔案上傳成功"。
}
catch (Exception t) {
t.printStackTrace()。
return result;
}
return result;
}
else {
return "not multipart"/span>。
}
}
%>
編輯。 所以我認為主要的問題是,我沒有通過表單中的action屬性來連接jsp檔案和servlet。 我已經創建了上傳servlet的功能實體,但我需要將UploadServlet類匯入JSP檔案,而沒有實際使用.java專案檔案。 我已經創建了UploadServlet類的jar檔案,并將該jar檔案添加到Web應用程式的WEB-INF/lib檔案夾中。但是當我試圖創建UploadServlet類的實體時,IDE告訴我它不能被決議為該型別。
是否有可能像這樣將用戶定義的類匯入JSP中?例如,我是否需要更多的依賴性?我不確定 tomcat servlet-api.jar 的情況,UploadServlet jar 可能正試圖使用它,但 servlet-api 類在 web 應用程式之外。因此,不可能直接將servlet-api.jar包含在WEB-INF/lib web應用程式下。
UploadServlet.java ---> UploadServlet.jar
package test.pkg。
import java.io.File。
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import javax.Servlet.ServletException;
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。
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UploadServlet(){
super()。
//建構式。
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//doPost實作。
}
}
JSP與UploadServlet
<%@ page language="java"/span> contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="test.pkg.UploadServlet" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
<title>檔案上傳</title>
</head>
<body>
<form method="post"/span> action="UploadServlet"/span> enctype="multipart/form-data"/span>>
選擇要上傳的檔案: <input type="file" name="uploadFile" />
<輸入型別="submit" value="Upload" />
<%
UploadServlet servletUp = new UploadServlet() 。
servletUp.doPost(request, response)。
%>
</form>
</body>
</html>
uj5u.com熱心網友回復:
我在回答時考慮到了你之前的評論,你問Servlet是否可以被定義在JSP中,因為你不確定你在這個專案中是否可以訪問Java類。
你可以,因為你可以在任何 JSP 中訪問請求和回應,就像任何其他 servlet 一樣(JSP 是一個 servlet)。也就是說,你應該將表單與對其值的處理分開。一般來說,要使用的好模式是POST-REDIRECT-GET。
我在表單中使用JSTL,因為這是更好的做法。
為了在另一個 JSP 中處理請求,我不得不求助于 scriptlet,這通常是一個糟糕的設計的標志,但是考慮到你不能編輯 Java 原始碼,沒有其他選擇......
包含表單的頁面。
包含表單的頁面。 設定你的表單為POST到另一個頁面 帶有資料處理代碼的JSP。 處理POST請求,記錄結果(錯誤或成功),然后重定向到你的表單以顯示它們 現在考慮到你的問題編輯,如果你已經定義了你的 如果你能寫一個Servlet,你應該怎么做
標籤: 下一篇:如何在C中宣告指向結構的指標?fileUploadForm.jsp<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% prefix="c"/span> uri="http://java.sun.com/jsp/jstl/core"/span>%>
<! DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>我的上傳檔案測驗表單</title>。
</head>
<body>
<h1>我的上傳檔案測驗表</h1>
<!--顯示資訊-->
<div class=" messages">
<c:if test="${not empty sessionScope.uploadErrors}"/span>>
<c:forEach items="${sessionScope.uploadErrors}" var="err" >
<p class="error"><c:out value="${err}" /> </p>
</c:forEach>
</c:if>
<c:if test="${not empty sessionScope.uploadSuccess}" >
<p class="success">檔案上傳成功: <c:out value="${sessionScope.uploadSuccess}" /></p>
</c:if>
</div>
<!-- 帶有POST動作的表單,指向uploadFormAction.jsp -->。
<form name="upload-test" action="./uploadFormAction.jsp" method="POST" enctype="multipart/form-data">
<標簽 for="upload">上傳檔案:</label>。
<input type="file" name="upload" id="upload" accept="image/png" />
<div class="submits">
<input type="submit" value="Send" />
</div>
</form>
</body>
</html>
fileUploadAction.jsp<% import="org.apache.commons.fileupload.FileItem" /span>%>
<% import="java.io.File"/span>%>
<% import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
<% import="java.util.List"/span>%>
<% import="java.util.ArrayList"/span>%>
<% import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%。
//存盤錯誤資訊
List<String> errors = new ArrayList<>()。
session.setAttribute("uploadErrors"/span>, errors)。
session.setAttribute("uploadSuccess", null)。
//Check for correct form encoding[/span]。
if (!"POST".equalsIgnoreCase(request.getMethod())) {
errors.add("Form must have method="POST"") 。
}
if (!ServletFileUpload.isMultipartContent(request)) {
errors.add("form has no multipart data to read from") 。
}
if (errors.size() < 1) {
try {
//為基于磁盤的檔案專案創建一個工廠。
DiskFileItemFactory factory = new DiskFileItemFactory() 。
//配置一個存盤庫(確保使用一個安全的臨時位置)。
ServletContext servletContext = this.getServletConfig().getServletContext()。
File repository = (File) servletContext.getAttribute("javax.servlet.text.tempdir") 。
factory.setRepository(repository)。
//創建一個新的檔案上傳處理器。
ServletFileUpload upload = new ServletFileUpload(factory)。
upload.setSizeMax(4L * 1024 * 1024)。)
//決議請求
List<FileItem> items = upload.parseRequest(request);
String found = null。
for (FileItem item : items) {
if (item.isFormField()) {
//處理表單中的其他欄位。
} else if ("upload".equals(item.getFieldName()) {
if (item.getSize() > 0) {
if (found != null) {
errors.add("只允許一個檔案")。
} else {
found = item.getName();
File uploadedFile = new File(" 。 /uploads/","picture.png")。)
if (uploadFile.exists()) uploadedFile.delete()。
item.write(uploadFile)。
}
}
} else { /Other file field[/span]。
//Ignore it? error?
}
}
if (found == null) {
errors.add("沒有上傳的檔案!")。
}
session.setAttribute("uploadSuccess", found)。
} catch (Exception e) {
e.printStackTrace()。
//應該記錄它并以更可讀的形式回傳。
errors.add(e.getMessage())。
}
}
response.sendRedirect("uploadFormPage.jsp") 。
%>。
Servlet類并想從JSP中呼叫它,那么我想你可以使用與這里描述的相同的原則,并創建一個新的Servlet的intance來呼叫它的doPost方法,在那里你得到POST請求,但這是假設你的Servlet是無狀態的并且不使用web.xml的init引數。
<form>的目標改為action="<c:url value ="/uploadFile" />"@WebServlet注解),并使用與fileUploadAction.jsp相同的代碼import java.io.File。
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession。
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload。
@WebServlet("/uploadFile")
public class FileUploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession()。
//存盤錯誤資訊
List<String> errors = new ArrayList<>()。
session.setAttribute("uploadErrors"/span>, errors)。
session.setAttribute("uploadSuccess", null)。
//Check for correct form encoding[/span]。
if (!"POST".equalsIgnoreCase(request.getMethod())) {
errors.add("Form must have method="POST"") 。
}
if (!ServletFileUpload.isMultipartContent(request)) {
errors.add("form has no multipart data to read from") 。
}
if (errors.size() < 1) {
try {
//為基于磁盤的檔案專案創建一個工廠。
DiskFileItemFactory factory = new DiskFileItemFactory() 。
//配置一個存盤庫(確保使用一個安全的臨時位置)。
ServletContext servletContext = this.getServletConfig().getServletContext()。
File repository = (File) servletContext.getAttribute("javax.servlet.text.tempdir") 。
factory.setRepository(repository)。
//創建一個新的檔案上傳處理器。
ServletFileUpload upload = new ServletFileUpload(factory)。
upload.setSizeMax(4L * 1024 * 1024)。)
//決議請求
List<FileItem> items = upload.parseRequest(request);
String found = null。
for (FileItem item : items) {
if (item.isFormField()) {
//處理表單中的其他欄位。
} else if ("upload".equals(item.getFieldName()) {
if (item.getSize() > 0) {
if (found != null) {
errors.add("只允許一個檔案")。
} else {
found = item.getName();
File uploadedFile = new File(" 。 /uploads/","picture.png")。)
if (uploadFile.exists()) uploadedFile.delete()。
item.write(uploadFile)。
}
}
} else { /Other file field[/span]。
//Ignore it? error?
}
}
if (found == null) {
errors.add("沒有上傳的檔案!")。
}
session.setAttribute("uploadSuccess", found)。
} catch (Exception e) {
e.printStackTrace()。
//應該記錄它并以更可讀的形式回傳。
errors.add(e.getMessage())。
}
}
response.sendRedirect("uploadFormPage.jsp") 。
}
}
