一、
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(); }
注:
为保证服务器安全,如果文件不提供下载,上传文件应该放在外界无法直接访问的目录下,如WEB-INF目录下;
不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,而有些只是单纯的文件名,要处理获取到的上传文件的文件名的路径部分,只保留文件名部分;
为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
时间: 2024-11-03 21:00:18