准备工作
(视频教程推荐:java课程)
需要导入的jar包
运行截图
文件上传截图
文件下载截图
上传文件代码servlet
@WebServlet(name = "UploadServlet",value = "/upload") @MultipartConfig(maxFileSize = 1024*1024*5,maxRequestSize = 1024*1024*20) //1 添加MultipartConfig注解 public class UploadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //存放文件的目录 String realPath = request.getServletContext().getRealPath("/WEB-INF/upload"); File dir=new File(realPath); if(!dir.exists()){ dir.mkdirs(); } List<String> allowExts=new ArrayList<String>(); allowExts.add("jpg"); allowExts.add("png"); allowExts.add("gif"); //1乱码 request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); //2使用getParts()获取数据 Collection<Part> parts = request.getParts(); //3遍历 PrintWriter out = response.getWriter(); if(parts!=null&&parts.size()>0){ for (Part part : parts) { //判断表单元素是普通字段,还是文件 String submittedFileName = part.getSubmittedFileName(); if(submittedFileName==null){//普通字段 String name = part.getName(); String value = request.getParameter(name); System.out.println(name+"..."+value); }else{//文件 //判断文件是否为"" if(submittedFileName.equals("")){ continue; } //System.out.println(submittedFileName); //从请求头中获取文件 String dis = part.getHeader("content-disposition"); String filename=dis.substring(dis.lastIndexOf("filename=")+10, dis.length()-1); filename=filename.substring(filename.lastIndexOf("\\")+1); System.out.println(filename); //获取文件名的后缀 String ext=filename.substring(filename.lastIndexOf(".")+1); if(!allowExts.contains(ext)){ out.println(filename+"不符合上传文件类型要求..."); continue; } //把文件保存 //1创建新的文件名 String newFileName = UploadUtils.makeNewFileName(filename); //2创建新的路径 String newPath = UploadUtils.makeNewPath(realPath, filename); part.write(newPath+File.separator+newFileName); //删除part part.delete(); out.println("上传成功:"+filename); } } } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } }
每个属性表示的内容
文件下载代码servlet
@WebServlet(name = "DownLoadServlet",value = "/download") public class DownLoadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //乱码 request.setCharacterEncoding("utf-8"); //获取文件名 String uuidFilename = request.getParameter("filename");//d578be74fd864ac2a879d77b07f13793_backg.jpg //去掉uuid String filename=uuidFilename.substring(uuidFilename.indexOf("_")+1); //存放文件的根路径 String realPath = request.getServletContext().getRealPath("/WEB-INF/upload"); //获取真正目录 String path = UploadUtils.makeNewPath(realPath, filename); File file=new File(path+ File.separator+uuidFilename); if(file.exists()){ response.setHeader("content-disposition", "attachment;filename="+ URLEncoder.encode(filename, "utf-8")); ServletOutputStream os = response.getOutputStream(); FileInputStream fis=new FileInputStream(file); byte[] buf=new byte[1024*4]; int len=0; while((len=fis.read(buf))!=-1){ os.write(buf,0,len); } }else{ response.setContentType("text/html;charset=utf-8"); response.getWriter().write("文件不存在..."); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
每个属性表示的内容
读取下载文件servlet
@WebServlet(name = "ListFileServlet",value = "/listfile") public class ListFileServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1读取可以被下载的文件 String realPath = request.getServletContext().getRealPath("/WEB-INF/upload"); HashMap<String,String> map=new HashMap<>(); UploadUtils.listFile(new File(realPath),map); //2放入域中 request.setAttribute("map", map); //3转发 request.getRequestDispatcher("/list.jsp").forward(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
工具类servlet
public class UploadUtils { public static void main(String[] args) { String s = makeNewFileName("aaa.jpg"); System.out.println(s); } /** * 根据原始文件名产生一个新的文件名 * @param filename * @return */ public static String makeNewFileName(String filename){ //UUID 统一唯一标识码 String uuid = UUID.randomUUID().toString().replace("-", "");//默认32位的16进制 return uuid+"_"+filename; } /** * 创建新的路径 * @param path * @param filename * @return */ public static String makeNewPath(String path,String filename){ int num = filename.hashCode();//01101011001011011111111111 1111 0101 0101 int path1=num&0xf; int path2=(num>>4)&0xf; String newPath=path+ File.separator+path1+File.separator+path2; File dir=new File(newPath); if(!dir.exists()){ dir.mkdirs(); } return newPath; } //遍历可以被下载的文件 public static void listFile(File dir,HashMap<String,String> map){ File[] files = dir.listFiles(); if(files!=null&&files.length>0){ for (File file : files) { if(file.isDirectory()){ listFile(file, map); }else{ //文件 String uuidFilename=file.getName(); String filename=uuidFilename.substring(uuidFilename.indexOf("_")+1); map.put(uuidFilename,filename); } } } } }
相关教程推荐:java入门教程
以上是java實作檔案的上傳和下載功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!