文件上传
一、需求
- 将文件上传到指定目录中
二、附加需求
- 若上传的文件名相同,则产生一个不重复的文件名进行上传,如何处理?
- 若是只能上传图片文件,又该怎么进行处理?
三、大体思路
1、在进行文件上传之前,我们需要导入文件上传的所需jar包,如下图:
2、我们还需要一个能够提交表单的html网页,并且类型必须为文件提交表单,即必须在网页中设置form的enctype=“multipart/form-data”,具体html代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
上传用户:<input type="text" name="username"><br/>
上传文件:<input type="file" name="file1"><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
3、实现能够成功访问网页,并且新建类实现文件上传逻辑代码。
四、需求问题解决
1、上传文件路径找不到问题
- 上传文件我们首先想到的是往哪里上传?得有一个路径吧,以将文件上传到webapps下项目名下的upload目录下为例 (这里webapps在服务器,我这里是tomcat目录下)
问题一
- 我们应该通过什么方式去得到这个路径呢?
- 在新建项目底下新建一个Fileupload的servlet类,在其中的doGet()方法中写上传文件的代码,得到路径的方法有许多,但是如何去得到一个路径,最后是项目名呢?
- 解决方案:通过request.getServletContext().getRealPath(“upload”)这个方法,我们得到的是一个这样的目录:
C:\Users\apple\Desktop\briup\tomcat\apache-tomcat-8.5.38-windows-x64\apache-tomcat-8.5.38\webapps\FileUpLoad-Web\upload
问题二
- 我们顺着这个路径发现项目名下upload目录并不存在,如何去新建upload目录呢?
- 解决方案:如果目录不存在,那么通过file的mkdir()方法新建目录,传入的路径为我们上面得到的路径
File file = new File(path);
if (!file.exists()) {
file.mkdir();
}
问题三
- 若我们上传的文件名是中文,则会出现乱码问题,如何解决?
- 解决方案:通过我们得到的文件上传解析器设置编码
upload.setHeaderEncoding("UTF-8");
问题四
- 如何去判断我们在表单上上传的数据是否为文件上传表单?
- 解决方案:通过isMultipartContent(request)方法进行判断,若是正常表单数据则正常处理;
if (!ServletFileUpload.isMultipartContent(request)) {
// 如果不是文件上传表单,就是正常表单处理
return;
}
问题五
- 如何判断我们从表单中获取的属是不是正常表单属性
- 解决方案:通过isFormField()方法进行判断
if(fileItem.isFormField()) {
// 是正常表单属性
// 获取值,中文有可能乱码,要对乱码进行处理
String data = fileItem.getString("utf-8");
// 保存到数据库,目前只是打印
System.out.println(data);
} else {
// 不是正常表单属性,那么就是文件上传属性
五、附加需求问题解决
(1)如何保证上传的文件名不相同;
- 这里出现的一个问题是你若以文件上传当时的毫秒数作文新的文件名,但经过实验,这种情况只适用于你在不同的时间上传文件,当你同时上传两个文件时,他可能连一毫秒的时间都不会用到,所以还是会出现文件名相同的情况,所以我们要用到一个确保不会产生重复名字的方法取新文件名,如下:
- 通过java.util包底下的UUID获得完全不会重复的uuid。
UUID uuid = UUID.randomUUID();
(2)如何保证上传的文件为图片文件;
- 图片文件的后缀名为.jpg,.jpeg,.png,所以我们可以通过后缀名去判断是否为图片文件。
public interface FileUtil {
String[] suffix = {
".jpg",".png",".jpeg"};
/**
* 判断文件名是否为图片
* @param fileName
* @return
*/
public static boolean image(String fileName) {
// 得到文件的后缀名
String suffixName = fileName.substring(fileName.lastIndexOf("."));
for (String string : suffix) {
// 判断后缀名在没在数组里面
if(string.equals(suffixName)) {
// 如果在的话,说明文件名是图片的文件名
return true;
}
}
return false;
}
}
六、实现需求代码
1、file.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
上传用户:<input type="text" name="username"><br/>
上传文件:<input type="file" name="file1"><br/>
<input type="submit" value="提交">
</form>
<