上传下载&JDBC操作

上传下载 JDBC操作

一、文件上传

(一)准备工作

1)动态web项目

2)准备前台页面

表单请求方式改成post(才能传更大的数据量),且enctype属性值必须为"multipart/form-data",因为form表单默认get不会将文件的数据上传,只会上传普通的数据,设置了post属性之后,浏览器会将文件数据以二进制提交给服务器

method="post"  enctype="multipart/form-data"

3)导入jar包

commons-fileupload-1.2.2.jar

commons-io-1.4.jar

(二)解析上传的文件及普通的字段

1.判断是否在上传

boolean isMultipart = ServletFileUpload.isMultipartContent(req);

2.创建磁盘文件工厂

FileItemFactory factory = new DiskFileItemFactory();

3.创建文件上传处理器

ServletFileUpload upload = new ServletFileUpload(factory);

4.解析请求,返回由表单控件与数据封装成的对象FileItem组成的集合

List<FileItem> item = upload.parseRequest(req);

5.遍历FileItem集合,判断数据类型

//true为普通字段,false为文件字段
fileItem.isFormField()

6.获取文件名字

//获得前端参数名字
String fieldName = fileItem.getFieldName();
//拿到上传的文件名称
String filename = fileItem.getName();

7.将文件存储到指定目录

//获取/upload真实路径
String realPath = req.getServletContext().getRealPath("upload");
File file = new File(realPath,newName);
//2)将文件写入目录
fileItem.write(file);

(三)上传的细节问题

1.IE浏览器文件名称

比如前台传过来一个文件,这个文件在我们本地路径是:D:/xx/yy/z.jpg, 一般浏览器通过item.getName()可以拿到的值是z.jpg ,但IE浏览器拿到值是D:/xx/yy/z.jpg

FilenameUtils.getName(文件的名称)
2.字段值的中文乱码
String value = fileItem.getString("utf-8");

3.路径重复
//取到文件名称的后缀
String extension = FilenameUtils.getExtension(filename);
//拼接一个保存的路径
filename = UUID.randomUUID().toString()+"."+extension;

4.文件大小约束
upload.setFileSizeMax(10*1024); //10KB,默认是-1(代表没有大小限制)

5.文件类型约束

判断后缀是不是给定数组里面的值

private static String[] arr ={"jpg","png","bmp","gif"};
//判断后缀限制类型
List<String> asList = Arrays.asList(arr);
if(!asList.contains(extension)){
	throw new RuntimeException("图片类型错误!请上传jpg,png,bmp,gif类型图片");
}

6.图片是哪个用户

a.先把图片封装成一个图片对象

b.再把用户信息和图片对象一起保存到数据库

通过getFilename()方法获取name属性值作为key,getString()方法获得控件值作为value,存放到map集合中

//获得前端参数名字
String fieldName = fileItem.getFieldName();
//获取值
String value = fileItem.getString("utf-8");
map.put(fieldName, value);
//给类中的字段path赋值
filename = UUID.randomUUID().toString()+"."+extension;
map.put("path", req.getRequestURI()+"/"+filename);

二、文件下载

(一)超链接下载

简单a标签通过统一资源标识符URI定位资源

<a href="/xx/download/1.jpeg">1.jpeg</a><br/>
<a href="/xx/download/2.jpeg">2.jpeg</a><br/>
<a href="/xx/download/头像.jpg">头像.jpg</a><br/>
<a href="/xx/download/src.zip">src.zip</a><br/>

(二)Servlet程序下载

请求一个Servlet将资源以流的形式响应给我们

(一)准备工作

1.前台页面

<a href="/xx/download?name=1.jpeg">1.jpeg</a><br/>
<a href="/xx/download?name=2.jpeg">2.jpeg</a><br/>
<a href="/xx/download?name=头像.jpeg">头像.jpeg</a><br/>
<a href="/xx/download?name=src.zip">src.zip</a><br/>

2.后台代码

a.取到前台传过来的名称name

b.取到服务器下载文件路径,设置下载文件的名字

c.把下载文件构造成一个文件处理

d.写到浏览器端

//post请求解决乱码问题
req.setCharacterEncoding("utf-8");
String name = req.getParameter("name");
//拿到下载文件路径
String realPath = req.getServletContext().getRealPath("download");
File file = new File(realPath,name);
//把服务器文件通过流复制写到浏览器端
Files.copy(Paths.get(file.getAbsolutePath()), resp.getOutputStream());

(二)下载的细节问题

1.下载没有提示

点击下载的时候没有文件名称和后缀,如果下载的文件是图片会直接打开

//设置一个响应头,告诉浏览器,我需要做下载功能
resp.setContentType("application/x-msdownload");
String name = req.getParameter("name");
//设置下载文件的名字
resp.setHeader("Content-Disposition", "attachment; filename="+name);

2.解决中文乱码问题

浏览器传给我们的是ISO-8859-1编码,但在servlet.xml配置URIEncoding=‘UTF-8’

//把后台的utf-8变成浏览器的iSO8859-1响应给浏览器
String llq = new String(name.getBytes("UTF-8"),"ISO-8859-1");
//解决IE浏览器中文问题,但其他浏览器不支持
String llq = URLEncoder.encode(name,"utf-8");

3.兼容IE和其他浏览器

//获取响应头的信息
String header = req.getHeader("User-Agent");
String llq = null;
if (header.contains("Firefox")) {//说明火狐浏览器
    llq = ...
}else {//说明IE浏览器
    llq = ...
}

三、国际化

(一)概念

根据语言环境,决定我们的一个web站点里面用哪门子的语言

国际化又称为 i18n:英文单词internationalization

i18n由来:i和n 中间有18个字符

(二)在系统中使用国际化

1.准备两个配置文件system_en_US.properties和sytem_zh_CN.properties

username=\u7528\u6237\u540D
password=\u5BC6\u7801
login=\u767B\u9646

username=username
password=password
login=login

2.在代码中读取国家化(测试)

	@Test
	public void test() {
		// Locale.某地方,决定语言环境
//		ResourceBundle bundle = ResourceBundle.getBundle("system", Locale.US);
		ResourceBundle bundle = ResourceBundle.getBundle("system", Locale.CHINA);
		String username = bundle.getString("username");
		String password = bundle.getString("password");
		System.out.println("username = " + username);
        //中文:username =  用户名;英文:username =  username
		System.out.println("password = " + password);
        //中文:password = 密码;英文:password =  password
	}

(三)在网页中使用国际化

1.创建登录页面

2.导入jstl包和引入国际化标签

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

3.修改页面信息为fmt标签

<fmt:setBundle basename="system"/>
<form action="#" method="get">
	<fmt:message key="username"/>:<input type="text" name="username"><br/>
	<fmt:message key="password"/>:<input type="password" name="password"><br/>
	<input type="submit" value="<fmt:message key="login"/>">
</form>

四、JDBC持久层封装

Web层 创建Servlet,服务层

Service层 创建Service层,业务层

Dao层 创建接口 --------->Dao.Impl层 创建实现类

Domain层 创建实体类

Util层 工具类

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值