码迷,mamicode.com
首页 > 编程语言 > 详细

Java Web文件上传

时间:2015-10-12 17:23:50      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

一、

Java Web文件上传需要借助一些第三方库,常用的是借助Apache的包,有两个:

commons-fileupload

commons-io

 

二、前端代码示例:

    <form method="post" id="uploadApkForm" action="uploadapk"
        enctype="multipart/form-data">
        <p>
            文件:<input name="apkFile" type="file" /> <!--有multiple属性时支持选中多个文件同时上传-->
        </p>
        <p>
            版本:<input name="version" type="text" placeholder="请输入版本信息" />
        </p>
    </form>
注:

 enctype="multipart/form-data" 是必须的;

 若type="file" 的 input标签含有 multiple 属性,则能够在弹出框中同时选中多个文件上传

 

三、后端代码示例:

技术分享
        try {
            // 判断enctype属性是否为multipart/form-data
            boolean isMultipart = ServletFileUpload.isMultipartContent(request);
            if (!isMultipart) {// 不是文件上传,用传统方法获取数据
                // String userId = request.getParameter("userId");等
                return;
            }

            // 为multipart/form-data
            int maxMemorySize = 1024 * 1000 * 50;// 50MB
            int maxRequestSize = 1024 * 1000 * 100;// 100MB
            String projAbsolutePath = request.getRealPath("");
            String uploadRelativeDir = "upload/apk/";
            String uploadTmpRelativeDir = uploadRelativeDir + "/tmp/";
            File uploadDirObj = new File(projAbsolutePath + uploadRelativeDir);
            if (!uploadDirObj.exists()) {
                uploadDirObj.mkdirs();
            }
            File uploadTmpDirObj = new File(projAbsolutePath + uploadTmpRelativeDir);
            if (!uploadTmpDirObj.exists()) {
                uploadTmpDirObj.mkdirs();
            }

            // Create a factory for disk-based file items
            DiskFileItemFactory factory = new DiskFileItemFactory();

            // 当上传文件太大时,因为虚拟机能使用的内存是有限的,所以此时要通过临时文件来实现上传文件的保存
            // 此方法是设置是否使用临时文件的临界值(单位:字节)
            factory.setSizeThreshold(maxMemorySize);
            // 与上一个结合使用,设置临时文件的路径(绝对路径)
            factory.setRepository(uploadTmpDirObj);

            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);

            // 解决上传文件名的中文乱码,tomcat8不需要了
            // upload.setHeaderEncoding("UTF-8");

            // 设置上传内容的大小限制(单位:字节)
            upload.setSizeMax(maxRequestSize);

            // Parse the request
            List<FileItem> items = upload.parseRequest(request);
            Iterator<?> iter = items.iterator();
            String fieldName = null;
            FileItem item = null;
            String fileName = null;
            String version = null;
            while (iter.hasNext()) {
                item = (FileItem) iter.next();
                fieldName = item.getFieldName();
                if (item.isFormField()) {// 普通表单字段,版本信息
                    version = item.getString();
                    System.out.println(fieldName + " " + version);
                } else {// 文件字段
                    fileName = item.getName();
                    if (!fileName.endsWith("apk")) {// 不是apk文件
                        System.out.println("不是apk文件");
                        return;
                    }
                    fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
                    String contentType = item.getContentType();
                    boolean isInMemory = item.isInMemory();
                    long sizeInBytes = item.getSize();
                    System.out.println(fileName + " " + contentType + " " + isInMemory + " " + sizeInBytes);
                    item.write(new File(uploadDirObj, fileName));
                }
            }
            apkInfoMapper.insertVersionInfo(version,
                    new SimpleDateFormat("yy-MM-dd HH:mm:ss").format(System.currentTimeMillis()),
                    (uploadRelativeDir + fileName));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
View Code

 注:

 为保证服务器安全,如果文件不提供下载,上传文件应该放在外界无法直接访问的目录下,如WEB-INF目录下;

 不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,而有些只是单纯的文件名,要处理获取到的上传文件的文件名的路径部分,只保留文件名部分;

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

 

Java Web文件上传

标签:

原文地址:http://www.cnblogs.com/z-sm/p/4872004.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!