文件上传

1.文件上传的三要素

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

页面代码:

<form action="UploadServlet" method="post" enctype="multipart/form-data">
    <div align="20px">
        <div class="form-group">
            <label for="exampleInputPassword1">name</label>
            <input type="username" class="form-control" id="exampleInputPassword1" name="name">
        </div>
        <div class="form-group">
            <label for="exampleInputFile">File input</label>
            <input type="file" id="exampleInputFile" name="file">
        </div>
        <button type="submit" class="btn btn-default">提交</button>
    </div>
</form>

所需要的jar

代码:

 

Util类

 

/**
 * 文件上传的工具类,里面定义一些工具方法
 */
public class FileServletUtil {
    /**
     * 在给定的文件名前添加唯一的标识,让文件名在整个上传服务器中保持唯一
     * @param filename
     * @return
     */
    public static String makeFile(String filename){

        String s = UUID.randomUUID().toString()+"_"+System.currentTimeMillis()+"_"+filename;
        return s;
    }


    /**
     * 为方式一个目录下有太多的文件,使用hash算法来打乱存储
     * @param filename
     * @param savePath
     * @return
     */
    public static String makeFilePath(String filename, String savePath){
        //  得到文件名的hashCode值,得到的就是filename这个字符串对象在内存中的地址
        int hashCode = filename.hashCode();

        int dir1 = hashCode & 0xf;
        int dir2 = (hashCode & 0xf0) >> 4;

        String dir = savePath + File.separator + dir1 + File.separator + dir2;
        File file = new File(dir);
        if (!file.exists()){
            file.mkdirs();
        }
        return dir;
    }

上传代码

业务需求:

为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于 WEB-INF目录下。

为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名

为防止一个目录下面出现太多文件,要使用hash算法打散存储

要限制上传文件的最大值

要限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法

@WebServlet(name = "UploadServlet",urlPatterns = "/UploadServlet")
public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //  得到上传文件的保存目录, 将上传的文件放置于WEB-INF目录下, 可以防止外界直接访问该资源,保证程序的安全
        String savePath = getServletContext().getRealPath("WEB-INF" + File.separator + "upload");
        //  上传是生成的临时文件存放的目录
        String tempPath = getServletContext().getRealPath("WEB-INF" + File.separator + "temp");
        File temFile = new File(tempPath);
        if (!temFile.exists()){
            temFile.mkdir();
        }
        //1,创建DiskFileItemFactory工厂类
        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
        //  设置工厂的缓冲区大小,当上传的文件大小超过缓冲区的大小时,就会产生一个临时文件存放到指定的临时目录中
        diskFileItemFactory.setSizeThreshold(1024*100);
        //  设置上传是生成的临时文件的保存目录
        diskFileItemFactory.setRepository(temFile);
        //  2.  创建一个上传解析器
        ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
        //  解决上传文件中的中文乱码问题
        servletFileUpload.setHeaderEncoding("UTF-8");
        //  3. 判断提交上的数据是否是上传表单的数据
        if (!ServletFileUpload.isMultipartContent(request)){
            return;
        }
        // 设置文件的大小的最大值,50m
        servletFileUpload.setFileSizeMax(1024*1024*50);
        //  设置多个上传文件的总大小,最大值=同时上传的多个文件的最大值的和,100m
        servletFileUpload.setSizeMax(1024*1024*100);
        List<FileItem> itemList = null;
        //  4.  使用ServletFileUpload解析器上传数据,解析结果是一个List<FileItem>的集合,每一个FileItem对应一个Form表单的输入项
        try {
            itemList = servletFileUpload.parseRequest(request);
            for (FileItem fileItem : itemList) {
                if (fileItem.isFormField()){
                    String fieldName = fileItem.getFieldName();
                    //  解决用户输入时数据的中文乱码
                    String value = fileItem.getString("UTF-8");
                    System.out.println(fieldName+"-----"+value);
                }else{
                    //  如果FileItem中封装的是文件file域
                    String fileName = fileItem.getName();
                    if(fileName == null || "".equals(fileName.trim())){
                        continue;
                    }
                    fileName = fileName.substring(fileName.lastIndexOf(File.separator) + 1);
                    String filesufixName = fileName.substring(fileName.lastIndexOf(".") +  1);
                    System.out.println("上传文件的扩展名为:" + filesufixName);
                    //  获取item中上传文件的输入流
                    InputStream in = fileItem.getInputStream();
                    //  得到文件的保存名称
                    String saveFileName = FileServletUtil.makeFile(fileName);
                    //  得到文件保存目录
                    String saveRealPath = FileServletUtil.makeFilePath(saveFileName, savePath);
                    System.out.println("save real path " + saveRealPath);
                    FileOutputStream out = new FileOutputStream(saveRealPath + File.separator + saveFileName);
                    byte[] buffer = new byte[1024];
                    int len ;
                    while((len = in.read(buffer)) != -1){
                        out.write(buffer, 0, len);
                    }
                    in.close();
                    out.close();
                    System.out.println("upload success.");
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }

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

 

 

 

 

 

 

 

data
Input type=file
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值