我正在尝试从JSP中的表单标记调用servlet,但是我的输入区域中的值返回null,所以我收到java.lang.NullPointerException服务器错误,这很奇怪,因为我在命中之前填充了数据提交按钮
这是表格:
<form action="FileUploadServlet" enctype="multipart/form-data" method="post">
<div class = "col-md-6 col-md-offset-4" id = "articleSection">
<div class = "row" id = "title">
<input type ="text" name = "title" rows = "2" cols = "50" placeholder = "Name of your Article..." id = "artText">
<input type="hidden" name="id" value = '<%=(Integer)session.getAttribute("id")%>'>
</div>
<div id = "image">
<input type="file" name="image" id="fileToUpload">
</div>
<div class = "col-md-2" id = "submit">
<button type="submit" id = "submitBtn" name = "submit" value="articleSubmit">Submit</button>
</div>
</div>
</form>
这是servlet:
public class FileUploadServlet extends HttpServlet {
public static final String UPLOAD_DIR = "uploads";
public String dbFileName = "";
java.sql.Date sqlDate = new java.sql.Date(new java.util.Date().getTime());
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
int id = Integer.parseInt(request.getParameter("id"));
String title = request.getParameter("title");
Part part = request.getPart("image");//
String fileName = extractFileName(part);//file name
String applicationPath = getServletContext().getRealPath("");
String uploadPath = applicationPath + File.separator + UPLOAD_DIR;
System.out.println("applicationPath:" + applicationPath);
File fileUploadDirectory = new File(uploadPath);
if (!fileUploadDirectory.exists()) {
fileUploadDirectory.mkdirs();
}
String savePath = uploadPath + File.separator + fileName;
System.out.println("savePath: " + savePath);
String sRootPath = new File(savePath).getAbsolutePath();
System.out.println("sRootPath: " + sRootPath);
part.write(savePath + File.separator);
File fileSaveDir1 = new File(savePath);
dbFileName = UPLOAD_DIR + File.separator + fileName;
part.write(savePath + File.separator);
try {
Connection con = DatabaseConnection.getCon();
PreparedStatement pst = con.prepareStatement("insert into articles(title, date, user_id, image) values(?,?,?,?)");
pst.setString(1, title);
pst.setDate(2, sqlDate);
pst.setInt(3, id);
pst.setString(4, dbFileName);
pst.executeUpdate();
response.sendRedirect("articleDetails.jsp?name"+title);
} catch (Exception e) {
out.println(e);
}
}
private String extractFileName(Part part) {//This method will print the file name.
String contentDisp = part.getHeader("content-disposition");
String[] items = contentDisp.split(";");
for (String s : items) {
if (s.trim().startsWith("filename")) {
return s.substring(s.indexOf("=") + 2, s.length() - 1);
}
}
return "";
}
}
如果我将表单方法更改为“ GET”,则它不会返回null,但我要发布以便可以将文件插入数据库中
编辑:
我仅通过将方法移到enctype之前就可以修复nullPointerException,因此它看起来像:
<form action="FileUploadServlet" method="POST" enctype="multipart/form-data">
</form>
但是现在我收到此错误:
java.io.FileNotFoundException:C:\ Users \ ttcat \ Documents \ glassfish5 \ glassfish \ domains \ domain1 \ Generated \ jsp \ JspIpProject \ C:\ Users \ ttcat \ Documents \ NetBeansProjects \ JspIpProject \ build \ web \ uploads \ amihan.jpg(文件名,目录名或卷标语法不正确)
如何删除此路径?C:\ Users \ ttcat \ Documents \ glassfish5 \ glassfish \ domains \ domain1 \ generated \ jsp \ JspIpProject \
答案 0 :(得分:1)
尝试在您的服务中添加以下注释
@WebServlet(name = "FileUploadServlet", urlPatterns = {"/FileUploadServlet"})
@MultipartConfig(maxFileSize = 100 * 1024 * 1024) // 100MB max
public class FileUploadServlet extends FileUploadServlet {