servlet上传图片文件的两种方式
servlet中上传图片文件的两种方式
在eclipse中进行操作,首先给tomcat配置下虚拟文件的路径,双击Servers下我们要使用的tomcat,点击Modules,点击Add External Web Module...其中填写存放图片的路径和对应的映射地址。例:

首先是配置文件config.properties
#虚拟路径
VIRTUAL_PATH:http://127.0.0.1:8080/java_file/
#真实路径
REALY_PATH:D:\\work\\demo\\java_file\\
读取配置的工具类ReadConfig.java
public class ReadConfig {
public static String readConf(String key) {
Properties properties = new Properties();
// 使用ClassLoader加载properties配置文件生成对应的输入流
InputStream in = ReadConfig.class.getClassLoader().getResourceAsStream("config.properties");
// 使用properties对象加载输入流
try {
properties.load(in);
} catch (IOException e) {
e.printStackTrace();
}
//获取key对应的value值
return properties.getProperty(key);
}
}
基础静态数据类BasisData.java
public class BasicData {
public static final String VIRTUAL_PATH=ReadConfig.readConf("VIRTUAL_PATH");
public static final String REALY_VIDEO_PATH=ReadConfig.readConf("REALY_PATH");
}
做这些是为了提高代码的封装性和可移植性。
1.form表单传输
传输的Servlet
@WebServlet(urlPatterns="/upload")
public class UploadFileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
// 设置存放返回路径的变量
StringBuilder returnPath = new StringBuilder();
try {
// 实例化本地磁盘工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置文件上传启用的缓存的值,每 2M 写入一次临时文件
factory.setSizeThreshold(2 * 1024 * 1024);
// 设置缓存文件的临时存放目录
factory.setRepository(new File(BasicData.REALY_PATH));
// 实例化文件上传类
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置全部文件上传的最大值
upload.setFileSizeMax(Integer.valueOf(100) * 1024 * 1024);//单文件100M
upload.setSizeMax(Integer.valueOf(1024) * 1024 * 1024); //最多1G
// 获取前端上传的文件列表
List<FileItem> items = upload.parseRequest(req);
// 循环所有上传的字段或文字
for (FileItem item : items) {
if (item.isFormField()) { //普通内容 paramterm
// 获取字段名
String name = item.getFieldName();
// 获取字段值 括号内的参数不可少否则乱码
String value = item.getString("UTF-8");
// 打印不是文件的字段
System.out.println(name + ".." + value);
} else {
// 获取文件名
String name = item.getName();
// 确定文件存放的相对路径
String nameArr[] =name.split("\\.");
String filePath = System.currentTimeMillis() + "." + nameArr[nameArr.length-1];
// 将文件写入指定的路径
item.write(new File(BasicData.REALY_PATH + filePath));
// 删除缓存文件, 如果没有设置, 大部分时候临时文件也会被删除
item.delete();
// 将相对路径赋值给返回值
returnPath.append(filePath);
// 路径之间用逗号隔开
returnPath.append(",");
}
}
resp.getWriter().write("<img src='"+BasicData.VIRTUAL_PATH+returnPath.substring(0, returnPath.length()- 1)+"'/>"); //将图片返回显示在页面上
} catch (Exception e) {
e.printStackTrace();
resp.getWriter().write("上传失败");
}
}
}
前端界面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action='http://127.0.0.1:8080/java21072/upload' method="post" enctype="multipart/form-data" >
<input type='file' name='file1' />
<input name='name' />
<input type='submit' />
</form>
</body>
</html>
2.Ajax传输
传输的Servlet
@WebServlet(urlPatterns="/upload")
public class UploadFileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("application/json;charset=utf-8");
// 设置存放返回路径的变量
StringBuilder returnPath = new StringBuilder();
try {
// 实例化本地磁盘工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置文件上传启用的缓存的值,每 2M 写入一次临时文件
factory.setSizeThreshold(2 * 1024 * 1024);
// 设置缓存文件的临时存放目录
factory.setRepository(new File(BasicData.REALY_PATH));
// 实例化文件上传类
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置全部文件上传的最大值
upload.setFileSizeMax(Integer.valueOf(100) * 1024 * 1024);//单文件100M
upload.setSizeMax(Integer.valueOf(1024) * 1024 * 1024); //最多1G
// 获取前端上传的文件列表
List<FileItem> items = upload.parseRequest(req);
// 循环所有上传的字段或文字
for (FileItem item : items) {
if (item.isFormField()) { //普通内容 paramterm
// 获取字段名
String name = item.getFieldName();
// 获取字段值 括号内的参数不可少否则乱码
String value = item.getString("UTF-8");
// 打印不是文件的字段
System.out.println(name + ".." + value);
} else {
// 获取文件名
String name = item.getName();
// 确定文件存放的相对路径
String nameArr[] =name.split("\\.");
String filePath = System.currentTimeMillis() + "." + nameArr[nameArr.length-1];
// 将文件写入指定的路径
item.write(new File(BasicData.REALY_PATH + filePath));
// 删除缓存文件, 如果没有设置, 大部分时候临时文件也会被删除
item.delete();
// 将相对路径赋值给返回值
returnPath.append(filePath);
}
}
JSONObject jsonObject=new JSONObject();
jsonObject.put("flag", true);
jsonObject.put("filepath",BasicData.VIRTUAL_PATH+returnPath);
resp.getWriter().write(jsonObject.toString());
return;
} catch (Exception e) {
e.printStackTrace();
JSONObject jsonObject=new JSONObject();
jsonObject.put("flag", false);
jsonObject.put("msg","上传失败");
resp.getWriter().write(jsonObject.toString());
}
}
}
前端界面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form id='f1' onsubmit="return sub()">
<input type='file' name='file1' />
<input name='name' />
<input type='submit' />
<img style='display:none' id='img' src='' />
</form>
</body>
<!--导入jquery-->
<script src='lib/jquery-1.8.0.js'></script>
<script>
function sub(){
var fd=new FormData($('#f1')[0]);
console.log(fd.get("name"))
$.ajax({
url: 'http://127.0.0.1:8080/java21072/upload',
data:fd,
type:'post',
cache: false, // 不缓存数据
processData: false, // 不处理数据
contentType: false, // 不设置内容类型
success:function(res){
if(res.flag){
$('#img').show().attr("src",res.filepath);
}else{
alert(res.msg);
}
}
})
return false;//不提交
}
</script>
</html>
(注意之后在浏览器上请求时,localhost换成127.0.0.1

浙公网安备 33010602011771号