? 最近看了一本書(shū)上的代碼,代碼的主要功能是實(shí)現(xiàn)文件的上傳。但是,當(dāng)我運(yùn)行代碼的時(shí)候竟然報(bào)錯(cuò)了。(我用的IDEA)。有錯(cuò)就解決吧。以下是我遇到的幾個(gè)錯(cuò)誤。
廢話(huà)不多說(shuō)先附上源代碼。
UploadServlet.java
package com;
import java.io.File;
import java.io.IOException;
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.Part;
import java.lang.String;
import java.io.PrintWriter;
import javax.servlet.annotation.MultipartConfig;
import org.apache.catalina.core.ApplicationPart;
@WebServlet("/UploadServlet")
@MultipartConfig(location = "d:/temp") //D盤(pán)手動(dòng)創(chuàng)建temp文件夾
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String path = this.getServletContext().getRealPath("/"); //獲取服務(wù)器地址
Part p = request.getPart("file1"); //獲取用戶(hù)上傳的文件
if (p.getContentType().contains("image")){ //僅處理上傳的圖片文件
ApplicationPart ap =(ApplicationPart)p;
String fname1 = ap.getFilename(); //獲取上傳文件名
int path_idx = fname1.lastIndexOf("\\") + 1; //對(duì)上傳文件名進(jìn)行截取
String fname2 = fname1.substring(path_idx, fname1.length());
File file = new File(path + "/upload/" + fname2); //寫(xiě)入web根目錄下的upload文件夾中
out.write("文件上傳成功");
}
else{
out.write("請(qǐng)選擇圖片文件?。?!");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
index.jsp
<%--
Created by IntelliJ IDEA.
User: Chenaniah Gu
Date: 2019/5/11
Time: 21:55
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上傳</title>
</head>
<body>
<form action="UploadServlet" enctype="multipart/form-data" method="post">
選擇文件<input type="file" name="file1" id="file1"/>
<input type="submit" name="upload" value="上傳"/>
</form>
</body>
</html>
這是某本書(shū)的代碼,可能環(huán)境配置和書(shū)上的一樣,不會(huì)出錯(cuò),但是往往都是環(huán)境不一樣。下面來(lái)看幾個(gè)錯(cuò)誤。
1. import org.apache.catalina.core.ApplicationPart;報(bào)錯(cuò)
? 很明顯,這個(gè)報(bào)錯(cuò)就是因?yàn)檎也坏竭@個(gè)包,那么這個(gè)包在哪呢?其實(shí)它就在Tomcat根目錄中的lib文件夾中,這個(gè)包名叫做catalina.jar。導(dǎo)入這個(gè)包文件就OK啦,若導(dǎo)入后不行,那就重啟IDEA。
2. getFilename()方法找不到
? 分析一下,這個(gè)getFilename()方法是哪的?java自帶包定義的?,抱歉沒(méi)搜到。既然不是自帶包,你也沒(méi)定義,那就很有可能是引入包中的方法,再細(xì)細(xì)分析,可以發(fā)現(xiàn)是ap調(diào)用了它,ap的類(lèi)型是什么呢?ApplicationPart。打開(kāi)ApplicationPart方法,如下圖所示。
1.JPG
? 我用的是Tomcat9.0,打開(kāi)ApplicationPart.class
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.apache.catalina.core;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.Part;
import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.ParameterParser;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItem;
import org.apache.tomcat.util.http.parser.HttpParser;
public class ApplicationPart implements Part {
private final FileItem fileItem;
private final File location;
public ApplicationPart(FileItem fileItem, File location) {
this.fileItem = fileItem;
this.location = location;
}
public void delete() throws IOException {
this.fileItem.delete();
}
public String getContentType() {
return this.fileItem.getContentType();
}
public String getHeader(String name) {
return this.fileItem instanceof DiskFileItem ? this.fileItem.getHeaders().getHeader(name) : null;
}
public Collection<String> getHeaderNames() {
if (!(this.fileItem instanceof DiskFileItem)) {
return Collections.emptyList();
} else {
LinkedHashSet<String> headerNames = new LinkedHashSet();
Iterator iter = this.fileItem.getHeaders().getHeaderNames();
while(iter.hasNext()) {
headerNames.add(iter.next());
}
return headerNames;
}
}
public Collection<String> getHeaders(String name) {
if (!(this.fileItem instanceof DiskFileItem)) {
return Collections.emptyList();
} else {
LinkedHashSet<String> headers = new LinkedHashSet();
Iterator iter = this.fileItem.getHeaders().getHeaders(name);
while(iter.hasNext()) {
headers.add(iter.next());
}
return headers;
}
}
public InputStream getInputStream() throws IOException {
return this.fileItem.getInputStream();
}
public String getName() {
return this.fileItem.getFieldName();
}
public long getSize() {
return this.fileItem.getSize();
}
public void write(String fileName) throws IOException {
File file = new File(fileName);
if (!file.isAbsolute()) {
file = new File(this.location, fileName);
}
try {
this.fileItem.write(file);
} catch (Exception var4) {
throw new IOException(var4);
}
}
public String getString(String encoding) throws UnsupportedEncodingException {
return this.fileItem.getString(encoding);
}
public String getSubmittedFileName() {
String fileName = null;
String cd = this.getHeader("Content-Disposition");
if (cd != null) {
String cdl = cd.toLowerCase(Locale.ENGLISH);
if (cdl.startsWith("form-data") || cdl.startsWith("attachment")) {
ParameterParser paramParser = new ParameterParser();
paramParser.setLowerCaseNames(true);
Map<String, String> params = paramParser.parse(cd, ';');
if (params.containsKey("filename")) {
fileName = (String)params.get("filename");
if (fileName != null) {
if (fileName.indexOf(92) > -1) {
fileName = HttpParser.unquote(fileName.trim());
} else {
fileName = fileName.trim();
}
} else {
fileName = "";
}
}
}
}
return fileName;
}
}
? 你會(huì)發(fā)現(xiàn)根本沒(méi)有g(shù)etFilename()這個(gè)方法。是不是有一種被騙的感覺(jué)?
怎么解決呢??jī)煞N方法,首先你可以自己寫(xiě)一個(gè)這樣的方法,其次就是用java中的File類(lèi)。
修改后的代碼如下 UploadServlet.java
package com;
import java.io.File;
import java.io.IOException;
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.Part;
import java.lang.String;
import java.io.PrintWriter;
import javax.servlet.annotation.MultipartConfig;
import org.apache.catalina.core.ApplicationPart;
@WebServlet("/UploadServlet")
@MultipartConfig(location = "d:/temp") //D盤(pán)手動(dòng)創(chuàng)建temp文件夾
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String path = this.getServletContext().getRealPath("/"); //獲取服務(wù)器地址
System.out.println("服務(wù)器地址是"+path);
Part p = request.getPart("file1"); //獲取用戶(hù)上傳的文件
if (p.getContentType().contains("image")){ //僅處理上傳的圖片文件
ApplicationPart ap =(ApplicationPart)p;
String filename = ap.getSubmittedFileName(); //獲取文件名
System.out.println(filename);
File file = new File(path + "/upload/" + filename);
System.out.println("file.getPath()的值是"+file.getPath());
p.write(file.getPath()); //寫(xiě)入web根目錄下的upload文件夾中
out.write("文件上傳成功");
}
else{
out.write("請(qǐng)選擇圖片文件?。。?);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
最后附上一張成功運(yùn)行的截圖
2.JPG