java 文件的上传和下载的操作

文件上传

1.文件上传的技术
    *JSPSmartUpload:在jsp页面使用代码进行文件上传,已经不用了。
    *FileUpload:在java环境中实现文件上传,apache公司提供开发jar包
    *Servlet3.0:在这个版本提供了文件上传功能。
    *Struts2.0:在这个版本提供了文件上传功能。
2.文件上传的条件
    * form表单必须是post提交方式。
    * 使用<input type=”file” name=”xxx”/>;type必须是file类型,必须要有name属性值
    * form表单必须使用enctype=”multipart/form-data”属性
3.文件上传的步骤
    第一步:创建磁盘文件项工厂
    第二步:创建核心上传类
    第三步:使用核心上传类解析request对象 返回的List集合,集合里面有多个FileItem,List<FileItem>
    第四步:遍历list集合,得到每个FileItem
    第五步:判断是普通输入项还是文件上传项 boolean isFormField()
    第六步:如果是普通输入项得到值;
        如果是文件上传项编写上传的代码
            getFieldName():得到普通输入项name的属性的值
            getString():得到普通输入项里面输入的值
        文件上传项
            得到通过表单提交过了的文件的输入流,getInputStream()
            创建输出流,把文件的输入流写到服务器的一个文件中

4.基本代码实现
    `//创建磁盘文件项工程
    DiskFileItemFactory factory=new DiskFileItemFactory();
    //创建核心上传类
    ServletFileUpload servletFileUpload=new ServletFileUpload(factory);
    //解析请求
    try {
        List<FileItem > fileItems  = servletFileUpload.parseRequest(request);
        //处理解析结果,遍历fileItems集合,判断是普通项还是文件上传项
        for (FileItem fileItem : fileItems) {
            if (fileItem.isFormField()) {
                //是普通表单项
                String name = fileItem.getFieldName();//获取表单项name值
                String value = fileItem.getString("utf-8");//获取value值
                System.out.println(name+"="+value);
            }else{
                //是文件上传项
                String fileName = fileItem.getName();//获取文件名
                //我们只需要a.txt
                int index = fileName.lastIndexOf("\\");
                if (index!=-1) {
                    //C:\Users\zxy\Desktop\a.txt是这种文件名
                    fileName=fileName.substring(index+1);
                }
                System.out.println("fileName="+fileName);
                //生成唯一的用户名:
                String newFileName = UploadUtils.getUUIDFileName(fileName);
                //获取文件内容,文件内容可能是文本,如果是图片那就是流,总之获取输入流就行了。
                InputStream iStream = fileItem.getInputStream();
                //创建保存文件额路径
                String path = getServletContext().getRealPath("/upload");
                //获取文件该存放的子目录
                String innerDirectory = UploadUtils.getDirectoryByHashCode(newFileName);
                //String innerDirectory = UploadUtils.getDirectoryByDate();
                //创建完整目录File对象
                File saveDirectoryFile=new File(path+innerDirectory);
                if (!saveDirectoryFile.exists()) {
                    saveDirectoryFile.mkdirs();
                }
                System.out.println(saveDirectoryFile);
                //创建输出流,把文件写到服务器中
                OutputStream oStream=new FileOutputStream(new File(saveDirectoryFile,newFileName));
                //两个流对接
                int len=-1;
                byte[] buffer=new byte[1024];
                while((len=iStream.read(buffer))!=-1){
                    oStream.write(buffer, 0, len);
                }
                iStream.close();
                oStream.close();
            }
        }
    } catch (FileUploadException e) {
        e.printStackTrace();
    }`
5.问题解决
    1.文件同名问题(随机字符串唯一文件名解决)
    2.同一文件夹文件过多问题(目录分离算法)

文件下载

文件下载的一个流二个头

一个流:资源文件的输入流
    InputStream is1 = sc.getResourceAsStream("/download/美女.jpg");
二个头:
    响应数据的类型
        response.setHeader("Content-Type",mimeType );
    设置浏览器打开方式
        response.setHeader("Content-Disposition", "attachement;filename=美女.jpg");

----------------------------代码演示------------------------------------------------

package com.itheima.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sun.misc.BASE64Encoder;

public class DownloadServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //获取文件名解决中文乱码
        String filename = new String(request.getParameter("filename").getBytes("ISO8859-1"),"UTF-8");

        //获取web项目下的资源文件
        ServletContext sc = this.getServletContext();
        InputStream is = sc.getResourceAsStream("/web/download/"+filename);

        //设置content-type头
        response.setHeader("Content-Type", sc.getMimeType(filename));

        //获取客户端信息
        String agent = request.getHeader("User-Agent");
        //判断是火狐浏览器还是其他浏览器,对附件文件名进行编码
        if(agent.contains("Firefox")){
            //          filename = base64EncodeFileName(filename);
            filename = new String(filename.getBytes("UTF-8"), "ISO8859-1");
        }else{
            filename = URLEncoder.encode(filename,"UTF-8");
        }

        //设置附件下载的头
        response.setHeader("Content-Disposition", "attachment;filename="+filename);

        //获取响应中的输出流
        ServletOutputStream os = response.getOutputStream();
        int len = 0 ;
        byte[] bts = new byte[1024];
        while((len =is.read(bts))!=-1){
            os.write(bts, 0, len);
        }

        is.close();
    }

    public static String base64EncodeFileName(String fileName) {
        BASE64Encoder base64Encoder = new BASE64Encoder();
        try {
            return "=?UTF-8?B?"
                    + new String(base64Encoder.encode(fileName
                            .getBytes("UTF-8"))) + "?=";
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值