-
文件上传下载展示和思路
(1) 图片的上传,是把图片数据以二进制的方式放入数据库,还是把图片上传到服务器的某个目录下,数据库记录这个目录?哪种方式好?
存放在目录里比较好,图片比较大,作为二进制文件存放在数据库中比较耗数据库资源,降低了数据库的效率,有大量数据时读取速度慢,给数据库带来巨大的压力,甚至可能影响其他功能。(2) 图片的上传下载在java中有哪些jar包支持?
commons-fileupload.jar
commons-io.jar -
开始上传并理解上传API的作用
(1) 简述文件上传的步骤
在前台页面中使用form表单提交文件,使用servletFileupload对象获取req中的表单数据,价格表单数据存放在FileItem对象的集合中,遍历集合,使用FileItem对象的isFormField方法判断是否为filed表单项,不是则使用变量接受表单中的飞filed表单项参数,通过io流将文件保存到对应的文件夹中,将文件路径保存到数据库中。(2) FileItem类的方法有哪些,分别是什么意思?
- boolean isFormField()
isFormField方法用于判断FileItem类对象封装的数据是一个普通文本表单字段,还是一个文件表单字段,如果是普通表单字段则返回true,否则返回false。因此,可以使用该方法判断是否为普通表单域,还是文件上传表单域。 - String getName()
getName方法用于获得文件上传字段中的文件名。
注意IE或FireFox中获取的文件名是不一样的,IE中是绝对路径,FireFox中只是文件名。 - getContentType()
getContentType方法用于获取文件表单中的文件类型 - write()
write方法用于将FileItem对象中保存的主体内容保存到某个指定的文件中。 - getSize()
返回该上传文件的大小(以字节为单位)。
- boolean isFormField()
-
上传文件到指定目录
(1) 如何上传文件到指定目录?写出步骤
创建file对象,指定文件的路径,同过FileItem类的write()方法将文件写入到对于的file。 -
完善上传文件到指定目录
(1) 本节课完善了文件上传的哪些点?实现代码是什么?- 文件夹不存在时,创建文件夹
- 解决了文件的同名覆盖,使用uuid生成不重复的名字
- 有逻辑路径得到逻辑路径,提高灵活性
- 限制文件上传的类型
- 限制文件上传的大小(上传之后显示)
- 限制文件上传的大小(上传之前显示)
-
保存上传信息到数据库
(1) 本节课要往数据库里面存哪些数据?这些数据的作用是什么?
存入图片保存的路径,用于在前台页面显示图片。
图片原本的名称 ,用于下载图片是回显图片名称
图片类型。 下载是设置图片类型 -
将服务器的图片在客户端下载
(1) 简述下载的步骤,视图层怎么写,控制层怎么写?贴出代码,并写出注释
视图层:
<!--输出所有的学生信息 -->
<a href="add.jsp">添加学生信息</a>
<table align="center" border="1" width="70%">
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
<th>分数</th>
<th>照片</th>
<th>下载</th>
</tr>
<c:forEach items="${requestScope.stuList2}" var="stu" >
<tr>
<td>${stu.id}</td>
<td>${stu.name }</td>
<td>${stu.age }</td>
<td>${stu.score}</td>
<td><img alt="" src="upload/${stu.photoName }" width="100px"></td>
<td>
<a href="upload/${stu.photoName }">下载1</a>
<a href="servlet/DownServlet?id=${stu.id}">下载2</a>
</td>
</tr>
</c:forEach>
</table>
控制层:
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.获取学生的编号
int id = Integer.parseInt(request.getParameter("id"));
//2.根据编号调用业务层查询到该学生的所有信息(包括realName,photoName,photoType)
StudentService stuService = new StudentServiceImpl();
Student stu = stuService.findById(id);
//3.通过IO流实现照片下载(从服务器端到客户端)
//3.1创建一个输入流和输出流
String realPath = this.getServletContext().getRealPath("/upload");
//String fileName = "D:\\Java/apache-tomcat-7.0.79/webapps/updownload1\\upload\\"+stu.getPhotoName();
String fileName = realPath+"/"+stu.getPhotoName();
File file = new File(fileName);
response.setContentLength((int)file.length());//文件长度
response.setContentType(stu.getPhotoType());//MIME类型
//response.setHeader("Content-disposition", "inline");//!!!! attachment
String realName = stu.getRealName();//霓凰郡主.jpg
String userAgent = request.getHeader("User-Agent").toLowerCase();
if(userAgent.indexOf("msie")>=0){
realName = URLEncoder.encode(realName, "utf-8");
}else{
realName = new String(realName.getBytes("utf-8"),"iso-8859-1");//???
}
response.setHeader("Content-disposition", "attachment;filename="+realName);
InputStream is = new FileInputStream(file); //读服务器端一个文件
OutputStream os = response.getOutputStream(); //写到客户端
//3.2使用输入流和输出流完成复制操作(服务器端-----客户端)
IOUtils.copy(is, os);
//3.3关闭输入流是输出流
is.close();
os.close();
//表单 method= get 表单提交的中文乱码解决
//request.setCharacterEncoding("utf-8");//post
//String name = request.getParameter("name");
// byte [] bytes = name.getBytes("iso-8859-1");
// name = new String(bytes,"utf-8");
//name = new String(name.getBytes("iso-8859-1"),"utf-8");
}
-
完善下载操作
(1) 本节课完善了下载的哪些点?贴出对应代码和注释- 下载的文件直接显示,而不是提示下载。
response.setHeader(“Content-disposition”, “attachment;filename=”+realName); - 文件名中文乱码
Get方式:
name = new String(name.getBytes(“iso-8859-1”),“utf-8”);
post方式:
request.setCharacterEncoding(“utf-8”); - 完善文件保存的路径
- 下载的文件直接显示,而不是提示下载。
-
版本管理和SVN入门
(1) 什么是版本管理?为什么需要版本管理?
版本管理是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
为什么需要?
解决以下问题
i. 代码如何合并(手工合并几乎不可能)
ii. 历史版本的保存
iii. 跟踪哪些代码是谁修改(2) 除了svn外,还有哪些版本管理软件?
a) VSS:Microsoft 提供,Window 平台,小型开发团队所适合的工具。
b) CVS:开源工具,跨平台。绝大多数 CVS 服务已改用 SVN。CVS 已停止维护
c) SVN(Subversion):开源,跨平台,在 CVS 的基础上开发。使用企业众多,稳定安全,操作简单。集中式版本控制系统。
d) GIT:开源的分布式版本控制系统,用以有效高速的处理从很小到非常大的项目版本管理。(GITHUB 是一个用 GIT 做版本控制的项目托管平台,B/S 架构。放到 GITHUB 上的代码需要开源,并且是互联网开发) -
安装和使用Visual SVN
(1) 按照本节课的内容,安装svn并使用visual svn -
Subclipse的安装和使用2
(1) 简述在eclipse中安装svn插件的步骤,以及注意事项
a) 解压后将其中的 features 和 plugin 文件夹放入 MyEclipse 的 dropins 目录下
b) 重新启动 MyEclipse,即可自动发现并安装
c) 安装后在 window------preferrences——team 中可以看到 SVN
注意:一定要重启(2) 简述在eclipse中使用svn的方法
上传项目:
1.在eclipse中,从show view里调出SVN资源库视图
2.在SVN资源库窗口的空白位置右键选择新建资源库位
3.填好服务器的地址
4.资源库导入成功,SVN资源库视图下出现导入的资源库
5.新建project
6.写好project的初始版本
7.右键project --> team --> share project
8.选择repository类型为SVN --> 点击next
9.使用已有资源库位置
10.使用项目名称作为文件夹名 --> 点击Finish --> 输入用户名和密码(此步不一定每个人都有)
11.自由选择是否打开synchronize视图
12.右键project --> team --> 提交
13.自由选择是否写日志(建议写)
14.点击OK --> 上传到服务器成功,此时刷新资源库,资源库下出现上传的project
下载项目:
1.在资源库视图点击资源库左边的小三角形后出现该资源库下的所有project
2.选择要下载的project右键 --> 检出为
3.自由选择是否更改属性(建议使用默认) --> Finish --> 下载成功
从服务器更新代码:
1.右键项目project–>与资源库同步
2.选择打开Synchronize视图
3.与本地代码有不同的服务器代码将显示在Synchronize视图下,双击可以查看本地代码和服务器代码的对比,加号的为新增的文件(本地还没有)
4.将模式切换到Incoming Mode,这个模式下的代码都是服务器更新的代码,需要下载到本地的,右键要更新的文件–>team–>更新
5.如果出现下图这个符号,则代表本地代码和服务器代码有冲突(即:本地代码在未更新到最新版本的情况下,对代码进行了更改;或者在你对a.java写代码的期间,有人往服务器上传了新的a.java代码,使得代码间出现了冲突)