开发工具与关键技术:java、myeclise 10
作者:清晨
撰写时间:6.28
Jsp中的代码
<form action="${ctx}/servlet/UserServlet?fun=test" method="post" enctype="multipart/form-data" >
<div class="img-box text-center">
<img width="120" height="180" id="imgtestimg" />
<input type="file" id="testimg" name="testimg" />
</div>
<input type="text" class="form-control" name="testname" />
<input type="submit" class="form-control" value="上传" />
</form>
<script type="text/javascript" src="${ctx}/js/jquery-2.0.3.min.js"></script>
<script type="text/javascript" src="${ctx}/js/jquery.form.js"></script>
<script type="text/javascript">
//通过文件获取的接口来获取选择的图片并显示出来
//FileReader接口提供了一个异步的API,通过这个API可以从浏览器中异步访问文件系统中的数据。因此,FileReader接口可以读取文件中的数据,并将读取的数据放入到内存中去
//选择照片:用FileReader对象来读取本地数据,并且将数据结果赋值给image的src
var imgReaderI = new FileReader();
//图片文件 正则表达式过滤
regexImgFilter = /^(?:image\/bmp|image\/png|image\/jpeg|image\/jpg)$/i;
//回调函数onLoad异步
imgReaderI.onload = function (evt) {
$("#imgtestimg").attr("src", evt.target.result);
}
//在显示图片之前判断上传的图片是否是有效的格式(返回图片路径,调用回调函数)
$("#testimg").change(function () {
var imgFile = $("#testimg").prop("files")[0];
if (!regexImgFilter.test(imgFile.type)) {
//layer提示框,默认显示3秒后自动关闭
layer.msg('选择的不是一个有效的图片文件', { icon: 0 });
}else {
//readAsDataURL()方法可以获取API异步读取的文件数据,另存为数据URL;将该URL绑定到img标签的src属性上,就可以实现图片的上传预览效果了。
imgReaderI.readAsDataURL(imgFile);
}
});
</script>
Servlet
public String test(HttpServletRequest request,HttpServletResponse response) throws ServerException ,IOException{
//MAP目的:携带数据{username<==>tom,password<==>1234,userhead<==>/images/11.bmp}
Map<String,String> map=new HashMap<String,String>();
TestPo po=new TestPo();//创建对象
try {
//以下三行代码功能: 通过request.getInputStream();获取到请求体的全部内容
//进行解析,将每对分割线中的内容封装在了FileItem对象中
DiskFileItemFactory fac=new DiskFileItemFactory();
ServletFileUpload upload=new ServletFileUpload(fac);
List<FileItem> list=upload.parseRequest(request);
//4_遍历集合
for (FileItem item : list) {
//判断是否是普通象
if (item.isFormField()) {
//将普通项上name属性的值作为键,将获取到的内容作为值,放入MAP中
//写utf-8是为了解析中文
map.put(item.getFieldName(), item.getString("utf-8"));
}else{
//6_如果当前的FileItem对象是上传项
//修改名称有的人可能相同的图片名称要不一样
String oldFileName = item.getName();
String newFileName = UploadUtils.getUUIDName(oldFileName);
//通过FileItem获取到输入流对象,通过输入流可以获取到图片二进制数据
//用流跟好一点,二进制是乱码,多次转换就不好读取了
InputStream is=item.getInputStream();
String realPath = getServletContext().getRealPath("/images/");
File file=new File(realPath);
if (!file.exists()) {
file.mkdir();//创建目录
}
//在服务端创建一个空文件(后缀必须和上传到服务端的文件名后缀一致)
File file2=new File(file,newFileName);
if (!file2.exists()) {
file2.createNewFile();
}
//建立和空文件对应的输出流
//将输入流中的数据刷到输出流中
OutputStream os=new FileOutputStream(file2);
//释放资源
IOUtils.copy(is, os);
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(os);
//向map中存入一个键值对的数据 userhead<===> /image/11.bmp
map.put("testimg", "/images/"+newFileName);
}
}
//jar架包中的封装对象
BeanUtils.populate(po, map);
//设置时间
po.setTestdate(new Date());
//新增语句
int dd=iUserService.insertTest(po);
if (dd>0) {
System.out.println("新增成功");
}else{
System.out.println("新增失败");
}
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
Dao层面的代码
public int insertTest(TestPo po) {
String sql ="insert into test(testname, testdate,testimg) values(?,?,?)";
int result=0;
try {
con=DBUtil.getConnection(); ps=con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
ps.setString(1, po.getTestname());
ps.setDate(2, new Date(po.getTestdate().getTime()));
ps.setString(3, po.getTestimg());
ps.executeUpdate();
rs = ps.getGeneratedKeys();
if (rs.next()) {
result = Integer.parseInt(rs.getLong(1)+"");
}
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
结果