在实际工作中,我们总是会使用到上传图片的功能,至于java如何实现图片的上传,我们没必要去自己写一套上传的代码,因为上传的技术已经相当成熟,我们只要从网上找一个例子,调试好,然后集成到自己的项目中就行了,非常方便。那么今天,我就跟大家分享一下我通过apache commons fileupload实现的上传。
一、业务了解
首先,我们要清楚,每个上传的图片都要与数据库中的一条记录对应。因此,也就产生了多种存取方式。
将文件存放在tomcat(或其他)服务器中,然后将其名字改为该记录的主键名。
将文件存放在tomcat(或其他)服务器中,然后将其名字存到相应的记录中。
将文件存放在数据库中(不常用),通常我们只将系统自带的一些图片存在数据库中。
此次上传图片采用的方法二,只是将上传的图片名称保存到数据库中,而将上传的图片保存至tomcat服务器中,保存的目录是在代码中自动创建的。
二、开发环境搭建
需要下载的jar包,下载完成后,将其导入到java项目中。如图
三、上传的实现
让我们看看java是怎么实现上传的。这里我们采用的是java学习——架构的设计是项目的核心中的model2模式,也就是java中的mvc模式,这里我们将上传的实现现在Servlet中,其继承自httpServlet类。
1、item_upload.jsp页面
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@ page import="bjpowernode.drp.basedata.domain.*" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
Item item = (Item)request.getAttribute("item");
%>
<html>
<head>
<base href="<%=basePath %>">
<title>物料维护</title>
<link rel="stylesheet" href="style/drp.css">
<script src="script/client_validate.js"></script>
<script language="javascript">
</script>
</head>
<body class="body1">
<!-- 注意这部分必须为post提交,而且必须要有enctype="multipart/form-data" --!>
<form name="itemForm" target="_self" id="itemForm" method="post" action="servlet/item/FileUploadServlet" enctype="multipart/form-data">
<input type="hidden" name="itemNo" value="<%=item.getItemNo() %>">
<div align="center">
<table width="95%" border="0" cellspacing="2" cellpadding="2">
<tr>
<td>
</td>
</tr>
</table>
<table width="95%" border="0" cellspacing="0" cellpadding="0"
height="8">
<tr>
<td width="522" class="p1" height="2" nowrap>
<img src="images/mark_arrow_03.gif" width="14" height="14">
<b>基础数据管理>>物料维护>>上传物料图片</b>
</td>
</tr>
</table>
<hr width="97%" align="center" size=0>
<table width="95%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td height="29">
<div align="right">
物料代码:
</div>
</td>
<td>
<%=item.getItemNo() %>
</td>
</tr>
<tr>
<td height="26">
<div align="right">
物料名称:
</div>
</td>
<td>
<%=item.getItemName() %>
</td>
</tr>
<tr>
<td height="26">
<div align="right">
物料规格:
</div>
</td>
<td>
<%=item.getSpec() %>
</td>
</tr>
<tr>
<td height="26">
<div align="right">
物料型号:
</div>
</td>
<td>
<%=item.getPattern() %>
</td>
</tr>
<tr>
<td height="26">
<div align="right">
类别:
</div>
</td>
<td>
<%=item.getItemCategory().getName() %>
</td>
</tr>
<tr>
<td height="26">
<div align="right">
计量单位:
</div>
</td>
<td>
<%=item.getItemUnit().getName() %>
</td>
</tr>
<tr>
<td height="74">
<div align="right">
图片:
</div>
</td>
<td>
<img src="upload/<%=item.getFileName() %>" width="85" height="49">
</td>
</tr>
<tr>
<td width="22%" height="29">
<div align="right">
<font color="#FF0000">*</font>选择图片:
</div>
</td>
<td width="78%">
<input name="fileName" type="file" class="text1" size="40" maxlength="40">
</td>
</tr>
</table>
<hr width="97%" align="center" size=0>
<div align="center">
<input name="btn_upload" class="button1" type="submit"
id="btn_upload" value="上传">
<input name="btnBack" class="button1" type="button" id="btnBack"
value="返回" onClick="history.go(-1)">
</div>
</div>
</form>
</body>
</html>
2、处理上传文件的FileUploadServlet类
public class FileUploadServlet extends HttpServlet {
private ItemManager itemManager;
private File uploadPath;
private File tempPath; // 用于存放临时文件的目录
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
//使用Apache文件上传组件处理文件上传步骤:
//1、创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 文件大于此临界值时,采用临时文件
factory.setSizeThreshold(4096);
// 采用临时文件时,的临时文件目录
factory.setRepository(tempPath);
//创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
//设置上传文件大小的上限,-1表示无上限
upload.setSizeMax(1000000 * 20);
try {
//上传文件,并解析出所有的表单字段,包括普通字段和文件字段
List fileItems = upload.parseRequest(req);
//用来存放物料代码
String itemNo = "";
//循环将所有的文件上传
for (Iterator iter = fileItems.iterator(); iter.hasNext();) {
FileItem item = (FileItem) iter.next();
//是普通的表单输入域
if(item.isFormField()) {
//得到物料代码
if ("itemNo".equals(item.getFieldName())) {
itemNo = item.getString();
}
}
//是否为input="type"输入域
if (!item.isFormField()) {
String fileName = item.getName(); //得到文件名
long size = item.getSize(); //得到文件大小
if ((fileName == null || fileName.equals("")) && size == 0) {
continue;
}
//获取文件名称,截取字符串 如:C:\WINDOWS\Debug\PASSWD.LOG
fileName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
//保存文件,其实就是把缓存里的数据写到目标路径下
item.write(new File(uploadPath, fileName));
//调用itemManager对象将物料代码和其图片名称存入数据库
itemManager.uploadItemImage(itemNo,fileName);
}
}
//重定向
res.sendRedirect(req.getContextPath() + "/servlet/item/SearchItemServlet");
} catch (Exception e) {
e.printStackTrace();
throw new ApplicationException("上传失败!");
}
}
public void init() throws ServletException {
uploadPath = new File(getServletContext().getRealPath("upload"));
System.out.println("uploadPath=====" + uploadPath);
//如果目录不存在
if (!uploadPath.exists()) {
//创建目录
uploadPath.mkdir();
}
//临时目录
tempPath = new File(getServletContext().getRealPath("temp"));
if (!tempPath.exists()) {
tempPath.mkdir();
}
itemManager=new ItemManagerImpl();
}
}
四、总结
此代码也是从网上找的,然后改了改。我觉得这就够了,我们需要站在巨人的肩膀上,利用现有的资源,达到自己的目的。当然,我们会在以后的学习过程中给大家介绍java实现下载等,请大家继续关注。