准备好文件上传相应的jar包
设计我们的图片上传页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件</title>
</head>
<body>
<!--
multipart/form-data是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。
需要注意的是:默认情况下,enctype的值是application/x-www-form-urlencoded,
不能用于文件上传,只有使用了multipart/form-data,才能完整的传递文件数据。
-->
<form method="post" action="FileUploadServlet" enctype="multipart/form-data">
图收描述:<input type="text" name="msg"><br/>
上传图片:<input type="file" name="imgfile" id="file_input" onchange="show_image()">
<img src="" alt="" id="show_img" width="100px" height="100px" style="display: none;" />
<br/>
<input type="submit" value="上传">
</form>
</body>
</html>
<script>
function show_image() {
//抓取到上传图片的input标签的信息
file_input = document.getElementById("file_input");
//抓取到需要展示预览图的img标签信息
show_img = document.getElementById("show_img");
//回去预览图的src属性信息
show_img.src = window.URL.createObjectURL(file_input.files[0]);
//改变style属性中block的值
show_img.style.display = 'block';
}
</script>
接收不到文本数据问题
正常情况下,我们在Servlet那儿使用 request.getParemeter();获取前端传来的文本参数,但是在使用表单提交 enctype="multipart/form-data" 模式下, 我们得不到我们想要的文本参数,接下的代码可以解决这个问题
FileUploadServlet实现上传图片的代码
package com.softeem.servlet;
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;
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 java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
@WebServlet("/FileUploadServlet")
public class FileUploadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
//判断form表单 是否设置了 enctype="multipart/form-data"
if(ServletFileUpload.isMultipartContent(req)){
//创建FileItemFactory 工厂实现类
FileItemFactory fileItemFactory = new DiskFileItemFactory();
// 创建用于解析上传数据的工具类ServletFileUpload 类
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
try {
// 解析上传的数据,得到每一个表单项FileItem
List<FileItem> list = servletFileUpload.parseRequest(req);
//循环这2段数据并处理它们
for (FileItem fileItem : list) {
//判断那些是普通表单项,还是上传的文件类型
if(fileItem.isFormField()){
//处理普通表单项[文本数据]
//判断这个数据的名称是不是msg,如果是msg我们就对它做相应的处理
if("msg".equals(fileItem.getFieldName())){
//getString("utf-8")可以帮助我们解决中文乱码的问题
String msg = fileItem.getString("utf-8");
System.out.println("msg = " + msg);
}
}else{
//处理上传的图片数据
//getSize用来判断是不是选择了要上传的图片
if(fileItem.getSize() > 0){
String fileName = fileItem.getName();//获取文件名=
//获取图片的后缀名
int index = fileName.lastIndexOf(".");
//获取文件的后缀名
String substring = fileName.substring(index);
//生成新的图片名
String newFileName = System.currentTimeMillis() + substring;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String format = simpleDateFormat.format(new Date());
//全局对象[上下文对象]
ServletContext servletContext = this.getServletContext();
//获取到服务器的真实路径
String realPath = servletContext.getRealPath("/"+format);
File file = new File(realPath);
if( !file.exists() ){
//如果目录不存在就创建此目录
file.mkdirs();
}
//上传图片
fileItem.write(new File(realPath, newFileName));//上传图片
}else{
System.out.println("请选择图片");
}
}
}
} catch (FileUploadException e) {
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException(e);
}
}else{
System.out.println("form提交的数据格式不正确,无法实现文件上传");
}
}
}