java 文件或图片的上传小demo

本文介绍了一个Java Web应用中实现文件上传的具体步骤。包括所需依赖、前端表单配置及后端处理逻辑。通过DiskFileItemFactory和ServletFileUpload解析multipart/form-data格式的数据。

在进行上传之前需要

commons-fileupload-1.3.1.jar
commons-io-2.4.jar

这两个包。

前端代码:

在需要文件上传的表单中,需要把 enctype 设置为 multipart/form-data


	
	<form action="" method="post" enctype="multipart/form-data">
		<table>
			<tr>
				<td>设施名称</td>
				<td><input type="text" name="name"></td>
			</tr>
			<tr>
				<td>类别</td>
				<td><input type="text" name="type"></td>
			</tr>
			<tr>
				<td>照片</td>
				<td><input type="file" name="phote"></td>
			</tr>
			<tr>
				<td>简介</td>
				<td>	
					<textarea rows="10" cols="50" name="desc"></textarea>
				</td>
			</tr>
			<tr>
				<td></td>
				<td>
					<input type="submit" value="提交">
					<input type="reset" value="重置">
				</td>
			</tr>
		</table>
	</form>

后台的代码:

因为在页面使用了 multipart/form-data 方式进行提交,所有servlet后台不能用request.getParameter("name")来进行获取到对应的值,而是使用ServletFileUpload对象来进行解析。

protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		request.setCharacterEncoding("gb2312");
		response.setCharacterEncoding("gb2312");

		// 获取根目录对应的真实物理路径(即部署在服务器的地址)
		// 也就是说我们要把文件或图片存放到uploadImage该目录下
		String path = getServletContext().getRealPath("uploadImage");
		File uploadPath = new File(path);

		// 如果目录不存在
		if (!uploadPath.exists()) {
			uploadPath.mkdir();
		}
		// 临时目录
		File tempPath = new File(getServletContext().getRealPath("temp"));
		if (!tempPath.exists()) {
			tempPath.mkdir();
		}

		// DiskFileItemFactory:创建 FileItem 对象的工厂,可以设置相应的属性。
		DiskFileItemFactory factory = new DiskFileItemFactory();
		// 设置在内存中的大小
		factory.setSizeThreshold(4096);
		// 如果大小超过了内存中的设置的上限,则存到该临时目录下
		factory.setRepository(tempPath);
		ServletFileUpload upload = new ServletFileUpload(factory);
		// 上传文件或图片的最大的大小,如果文件超过这个限制,则抛出异常
		upload.setSizeMax(1000000 * 20);
		
		try {
			//获取所有的请求域
			List fileItems = upload.parseRequest(request);

			String name = null;
			String type = null;
			String desc = null;
			
			String fileName = null;// 文件或照片的名字

			for (Iterator iter = fileItems.iterator(); iter.hasNext();) {
				
				//获取每个域
				FileItem item = (FileItem) iter.next();
				
				// 判断是文件还是文本信息
				// 是普通的表单输入域
				if (item.isFormField()) {

					if ("name".equals(item.getFieldName())) {
						//获取普通表单域的值
						name = item.getString("gb2312").trim();
					}
					if ("type".equals(item.getFieldName())) {
						type = item.getString("gb2312").trim();
					}
					if ("desc".equals(item.getFieldName())) {
						desc = item.getString("gb2312").trim();
					}
				}
				// file域
				if (!item.isFormField()) {
					// 上传文件的名称和完整路径
					fileName = item.getName();
					long size = item.getSize();
					// 判断是否选择了文件
					if ((fileName == null || fileName.equals("")) && size == 0) {
						continue;
					}
					fileName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
					item.write(new File(uploadPath, fileName));
				}
			}
			// 将文件或图片文件名写入数据库
			String sql = null;
			db d = new db();
			d.executeInsert(sql);
			//继续后续操作
		} catch (Exception e) {
			System.out.println("上传失败");
			e.printStackTrace();
		}
	}

 

转载于:https://my.oschina.net/mengyuankan/blog/860186

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值