servlet上传图片文件的两种方式

servlet中上传图片文件的两种方式

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

image

首先是配置文件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

posted @ 2021-08-08 22:58  Plokit  阅读(1565)  评论(0)    收藏  举报