传智播客学习之上传下载

 

一、文件的上传

基本思想: FileUpload组件将页面提交的所有元素(普通form表单域,如text和文件域file)都看作一样的FileItem,这样上传页面提交的 request请求也就是一个FileItem的有序组合,FileUpload组件可以解析该request,并返回一个一个的FileItem。而对每一个FileItem,FileUpload组件可以判断出它是普通form表单域还是文件file域,从而根据不同的类型,采取不同的操作--如果是表单域,就读出其值,如果是文件域,就保存文件到服务器硬盘上或者内存中。

步骤:

1. 创建 FileItemFactory 子类 DiskFileItemFactory 的对象

2.为了得到 ServletFileUpload 对象, 先需要得到 FileItemFactory 的一个对象, 然后调用 new ServletFileUpload(FileItemFactory fif); 方法得到 ServletFileUpload 对象

3.为了得到 FileItem 的集合, 先需要得到 ServletFileUpload 对象, 然后调用该对象的 parseRequest() 方法得到 FileItem 的 List

4.从 HttpServletRequest 对象中得到 FileItem 的集合

5. 对上述集合进行遍历:判断是表单域还是文件域

 

使用 FileUpload 组件进行实现文件上传的步骤:

1.         表单的 method=“POST”, enctype=“multipart/form-data

2.         创建 FileItemFactory 实例: DiskFileItemFactory factory = new DiskFileItemFactory();

3.         创建 ServletFileUplad 实例:  ServletFileUpload upload = new ServletFileUpload(factory);

4.         使用 ServletFileUpload 实例解析请求,获取FileItem 的 List:                           List  items = upload.parseRequest(request);

5.         遍历 4 得到的集合, 判断是否为表单域或为文件域

6.         表单域相关方法: item.getFieldName(), item.getString()

7.         文件域相关方法:    item.getName(), getContentType(), getSize()

8.         注意1: 在 Servlet 中不能使用 request.getParameter() 方法获取请求参数; 在 JSP 页面上也不能使用 ${param.xxx} 进行数据回显

9.         注意2: 关于表单的字符乱码问题

a)         servletFileUplaod.setHeaderEncoding(“UTF-8”); 可以解决文件域的字符编码问题

b)        通过 new String(value.getString(“iso-8859-1”), “UTF-8”); 解决表单域的字符编码问题

二、文件的下载

方法一、页面实现

方法二、代码实现

在实际开发中,需要隐藏下载文件的真实地址,或者下载的文件需要一个程序来动态的确定后在传送给客户端,所以方式一有一定不足之处,所以我们可以利用程序编码实现下载。这样不仅可以可以增加安全访问控制,只对经过授权认证的用户提供下载,同时可以从任意位置提供下载的数据。

步骤如下:

1)  利用程序实现下载需要设置 2 个报头

2)  文件的下载

FileInputStream fis=new FileInputStream(path);

       BufferedInputStream bis=new BufferedInputStream(fis);//获取输出流

       OutputStream  os=response.getOutputStream();

       BufferedOutputStream bos=new BufferedOutputStream(os);//从输入字节流中读取信息写入到输出字节流中

              byte[] b=new byte[1024*200];

              int len=0;

              while((len=bis.read(b))!=-1){

                     bos.write(b, 0, len);

              }

              bos.close();

              bis.close();}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值