JAVA实现文件上传

文件上传功能的实现

在servlet3.0之前,文件上传还需要导入两个commonsjar包,而3.0之后,servlet自己就支持了文件上传的组件,本文主要利用后者提供的上传组件完成上传功能。

文件上传细节

1,不能用自带的方法直接获取文件名,一些老版本的浏览器可能会会出现问题(要对文件名进行提取)
2,相同文件上传的覆盖问题
3,上传文件自动创建不同的上传路径
4,文件上传的大小约束
5,文件上传类型的约束

代码实现

UploadUtils.java
这是一个工具类,主要解决自动生成不同文件名以及路径问题

public class UploadUtils {
    //创建新的文件名称
    public static String createNewFileName(String filename){
        String s = UUID.randomUUID().toString().replace("-", "");
        return s+"_"+filename;
    }
    //上传文件时创建不同的上传路径,防止图片过多,打开效率低下
    public static String createNewPath(String path,String filename){
        int i = filename.hashCode();
        int path1=i&0xf;
        int path2=(i>>4)&0xf;
        String realPath=path+ File.separator+path1+File.separator+path2+filename;
        File dir=new File(realPath);
        if(!dir.exists()){
            dir.mkdirs();
        }
        return realPath;
    }
}

upload.jsp 前端页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件的上传</title>
</head>
<body>
<h2>文件的上传</h2>
<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
    <table>
        <tr align="center">
            <td>用户名:</td>
            <td><input type="text" name="username"></td>
        </tr>
        <tr align="center">
            <td>图片:</td>
            <td><input type="file" name="picture1"></td>
        </tr>
        <tr align="center">
            <td>图片:</td>
            <td><input type="file" name="picture2"></td>
        </tr>
        <tr align="center">
            <td colspan="2"><input type="submit" value="提交"></td>
        </tr>
    </table>


</form>
</body>
</html>

UploadServlet.java

@WebServlet(name = "UploadServlet",value = "/upload")
@MultipartConfig(maxFileSize = 1024*1024*5,maxRequestSize = 1024*1024*20)//必须要添加这个注解,同时有控制文件大小的约束属性
public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //servlet3.0之前需要导入jar包,3.0之后不需要导入jar包则可完成文件上传。
        //设置编码格式
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        String realPath = request.getServletContext().getRealPath("/WEB-INF/upload");//上传的文件应该放入WEB-INF文件中,防止一些恶意人员在地址栏进行访问。
        //支持文件上传的文件类型
        List<String> extList=new ArrayList<>();
        extList.add("jpg");
        extList.add("png");
        File dir=new File(realPath);
        if(!dir.exists()){
            dir.mkdirs();
        }
        PrintWriter writer = response.getWriter();
        //接收参数
        Collection<Part> parts = request.getParts();
        if(parts!=null&&parts.size()>0){
            for (Part part : parts) {
                String submittedFileName = part.getSubmittedFileName(); //判断是普通字段还是上传字段
                if(submittedFileName==null){
                    String name = part.getName();
                    String username = request.getParameter(name);
                    System.out.println(username);
                }else {
                    if(submittedFileName.equals("")){
                        //文件名为空
                        continue;
                    }
                    //防止不同浏览器获取到错误格式的文件名进行字符串处理
                    String header = part.getHeader("content-disposition");
                    System.out.println(header);
                    String substring = header.substring(header.lastIndexOf("filename=") + 10, header.length() - 1);
                    System.out.println(substring);
                    String filename=substring.substring(substring.lastIndexOf("\\")+1);
                    String ext = filename.substring(filename.lastIndexOf(".") + 1); //获得后缀类型
                    if(!extList.contains(ext)){
                        //上传的文件类型不存在类型列表中,则不允许上传
                        writer.write("不支持此类型文件进行上传");
                        continue;
                    }
                    //相同文件上传,防止被覆盖
                    String newFileName = UploadUtils.createNewFileName(filename);
                    //上传不同的文件到不同的文件夹下面,防止一个页面包含文件过多的问题
                    String newPath = UploadUtils.createNewPath(realPath, newFileName);
                    //System.out.println(submittedFileName);
                    part.write(newPath+File.separator+filename);
                    writer.write("上传成功:"+submittedFileName);
                    //删除缓存part
                    part.delete();
                }
            }
        }
    }

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

启动服务器进行测试即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值