文件上传和文件下载的简单应用

 文件上传:是把本地的文件上传到服务器中,在数据库中保存对应图片的名称即可。

 文件下载:是把服务器中的文件下载到本地。

文件上传实现

jsp页面实现

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户添加</title>
</head>
<body>

<h3>用户注册页面</h3>
<form action="FileUpload" method="post" enctype="multipart/form-data">
    <p>
        姓名:<input type="text" name="name"/>
    </p>
    <p>
        年龄:<input type="text" name="age"/>
    </p>
    <p>
        分数:<input type="text" name="score"/>
    </p>
    <p>
        文件:<input type="file" name="fil"/>${msg}
    </p>
    <p>
        <input type="submit" value="提交"/>
    </p>
</form>
</body>
</html>

[注]:
    【A】method="post"   原因:

     get方式数据的传输是依附于URL地址,URL中没有办法传输图片,因为URL传输的数据量有限制的。
    【B】enctype文件传输的方式
        默认值:application/x-www-form-urlencoded  按照普通文本传输
        enctype="multipart/form-data"   按照二进制流的方式进行传输


Controller实现

@WebServlet("/FileUpload")
public class FileUpload extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决请求的中文乱码
        //[1]创建文件上传的工厂对象
        FileItemFactory  factory =new DiskFileItemFactory();
        //[2]获得文件上传的组件
        ServletFileUpload   fileUpload=new ServletFileUpload(factory);
        fileUpload.setHeaderEncoding("utf-8");
         String   name="";
         int   age=0;
         double  score=0;
         String filename="";
         String filetype="";
        
        try {
            //[3]获得文件上传的表单对象  集合中包含的是所有的表单项内容
            List<FileItem> list = fileUpload.parseRequest(req);
            //item:是我们前台每一个表单项
            for (FileItem  item:list){
                //System.out.println(item.getFieldName()+"--->"+item.getName()+"--->"+item.getSize()+"---->"+item.getContentType()+"--->"+item.isFormField());
                if(!item.isFormField()){
                    //是文件表单项
                    // .jpg
                    String substring = item.getName().substring(item.getName().lastIndexOf("."));
                    //文件的类型
                    filetype=item.getContentType();
                    /******【F】指定上传文件的类型  .png  .gif  .jpg*************/
                    if(!(".png".equals(substring)||".gif".equals(substring)||".jpg".equals(substring))){
                        req.setAttribute("msg","文件类型只可以是图片");
                        req.getRequestDispatcher("/save.jsp").forward(req,resp);
                        return;
                    }
                    /*****【E】指定上传文件的大小********/
                    if(item.getSize()>20*1024){
                        req.setAttribute("msg","文件最大是20k");
                        req.getRequestDispatcher("/save.jsp").forward(req,resp);
                        return;
                    }

                    /****【D】使用UUID解决文件名称冲突问题*** f.l.jpg*****/
                    String uuid = UUID.randomUUID().toString();
                      filename=uuid+substring;
                    /****【C】动态获得服务器目录**/
                    String realPath = req.getServletContext().getRealPath("/upload");
                    //D:\Intermediate course\03demo\out\artifacts\pageS2_war_exploded/upload
                    System.out.println(realPath);
                    /****【B】解决文件目录不存在问题*********/
                    File  file=new File(realPath);
                    if(!file.exists()){
                        file.mkdirs();
                    }
                    item.write(new File(file,filename));
                }else {
                    //证明是普通表单项
                    if("name".equals(item.getFieldName())){
                         name = item.getString("utf-8");
                    }
                    if("age".equals(item.getFieldName())){
                         age = Integer.parseInt(item.getString());
                    }
                    if("score".equals(item.getFieldName())){
                         score =Double.parseDouble(item.getString());
                    }
                }
            }
            Student  student=new Student(0,  name,  age,  score,  filename,  filetype);
            StudentService  studentService=new StudentServiceImpl();
            int save = studentService.save(student);
            if(save>0){
                resp.sendRedirect(req.getContextPath()+"/StudentController2");
            }else {
                req.setAttribute("msg","添加失败");
                req.getRequestDispatcher("/save.jsp").forward(req,resp);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

[注]:

/** 遇到的问题:
 *
 *   1、上传图片的时候名字中文乱码: ok
 *
 *      A、 req.setCharacterEncoding("utf-8");
 *
 *      B、fileUpload.setHeaderEncoding("utf-8");
 *
 *   2、上传的文件夹名称必须给出: ok
 *          file.exists()
 *
 *          file.mkdirs()
 *
 *   3、上传不到当前服务器的路径中: ok
 *
 *     req.getServletContext().getRealPath("/upload");
 *
 *   4、相同的图片名称会覆盖: ok
 *
 *      String uuid = UUID.randomUUID().toString();
 *
 *   5、无法指定上传图片的大小:  ok
 *
 *      A、item.getSize()>20*1024
 *
 *      B、fileUpload.setSizeMax(20*1024);
 *
 *   6、无法指定上传图片的类型:ok
 *
 *   7、普通表单项的值如何获得:
 *
 *   item.getString();
 * */

文件下载

jsp实现

<tr>
        <th>用户ID</th>
        <th>用户名称</th>
        <th>用户年龄</th>
        <th>用户分数</th>
        <th>用户图片</th>
        <th>操作</th>
    </tr>
    <c:forEach items="${list}" var="stu">
        <tr>
            <th>${stu.id}</th>
            <th>${stu.name}</th>
            <th>${stu.age}</th>
            <th>${stu.score}</th>
            <th><img src="/pageS2/upload/${stu.filename}" width="80px"> </th>
            <th><a href="/pageS2/FileDownLoad?filename=${stu.filename}&filetype=${stu.filetype}">下载</a> </th>
        </tr>
    </c:forEach>

Controller实现

@WebServlet("/FileDownLoad")
public class FileDownLoad extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获得服务器中目录
         //
        String realPath = req.getServletContext().getRealPath("/upload");
        //获得需要下载的文件名称
        String filename = req.getParameter("filename");
        //文件类型
        String filetype = req.getParameter("filetype");
        File  file =new File(realPath+"/"+filename);
        //[1]把需要下载的图片读过来
        InputStream   inputStream =new FileInputStream(file);
        //设置下载内容长度
        resp.setContentLength((int) file.length());
        //设置下载的类型
        resp.setContentType(filetype);
        //设置响应头
        resp.setHeader("Content-Disposition","attachment;filename="+filename);
        //[2]写到本地中
        OutputStream  outputStream =resp.getOutputStream();
        //完成文件的读写操作
        IOUtils.copy(inputStream,outputStream);
        outputStream.close();
        inputStream.close();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值