java:文件上传与下载

 文件上传

 

关键代码:

<form action="地址" method="post" enctype="multipart/form-data">
    <input type="file" name="参数名"/>
</form>


注意:
1) method必须是post
2) 必须采用复杂的格式,不能是name=value的参数格式, 必须是multipart/form-data的格式

apache提供了 commons-fileupload.jar包专门用来解析multipart/form-data的格式
         依赖:  commons-io.jar包
           
// 通过程序创建目录
new File("e:\\images").mkdirs()

upload.jsp

<%--
  Created by IntelliJ IDEA.
  User: 浔者
  Date: 2018/10/16
  Time: 19:12
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>上传</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="text" name="uname" />
    <input type="file" name="img" />
    <input type="submit" value="提交"/>
</form>
</body>
</html>

UploadServlet.jsp

package cn.seeker.controller;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;

@WebServlet(urlPatterns = "/upload")
public class UploadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 提前创建存储图片的目录
        new File("f:\\images").mkdirs();
        // 将上传文件存入服务器磁盘的一个工具类
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //核心文件上传工具
        ServletFileUpload sfu = new ServletFileUpload(factory);
        //10k
        sfu.setSizeMax(1024*1024);
        try{
            List<FileItem> fileItems = sfu.parseRequest(req);
            //遍历参数集合
            for (FileItem item : fileItems) {
                //如果是普通表单项
                if(item.isFormField()){
                    System.out.println("参数名:"+item.getFieldName());
                    System.out.println("值:"+item.getString("utf-8"));
                }else{ //是一个文件
                    // item.getInputStream() 拿到文件的输入流
                    // item.write()  写入服务器目标文件
                    System.out.println("文件长度:"+item.getSize());
                    if(item.getSize()>0){
                        System.out.println("文件的原始名:"+item.getName());
                        item.write(new File("f:\\images\\" + item.getName()));
                    }
                }
                System.out.println("----------");
            }
        } catch (FileUploadBase.SizeLimitExceededException e) {
            req.setAttribute("error", "上传的文件超过了大小限制");
            req.getRequestDispatcher("/upload.jsp").forward(req, resp);
        }catch (FileUploadException e) {
            e.printStackTrace();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

下载

DownloadServlet.java

package cn.seeker.controller;

import org.apache.commons.io.IOUtils;
import sun.nio.ch.IOUtil;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

// 用来下载服务器上F:\download目录下任意的文件
@WebServlet(urlPatterns = "/download/*")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //当响应的content-type设置为image,浏览器会显示图片
        //resp.setContentType("image/jpg");

        // 2) 如果要把图片进行下载操作
        resp.setContentType("application/octet-stream");
        resp.addHeader("content-disposition","attachment");

        // 把【浏览器的路径】 转换为 【服务器的磁盘路径】
        // 获取浏览器实际输入路径
        String uri = req.getRequestURI();
        System.out.println(uri);
        // 拼接图片的磁盘路径
        String path = "f:\\" + uri;
        //如果文件不存在,返回404
        if(!new File(path).exists()){
            resp.sendError(404);
            return;
        }
        //如果存在,从文件输入流读取,向响应的输出路写
        FileInputStream is = new FileInputStream(new File(path));
        OutputStream os = resp.getOutputStream();
        IOUtils.copy(is,os);
        IOUtils.closeQuietly(is);
    }
}

此处上传下载存在文件名中文乱码问题,暂时没有解决,读者可自行尝试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值