·        简介

  文件上传和下载是java web中常见的操作,文件上传主要是将文件通过IO流传放到服务器的某一个特定的文件夹下,而文件下载则是与文件上传相反,将文件从服务器的特定的文件夹下的文件通过IO流下载到本地。

  对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,struts上传的功能就是基于这个实现的。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。

·        文件上传

  1、文件上传页面和消息提示页面

  upload.jsp页面的代码如下:

<%@ page language="java" pageEncoding="UTF-8"%><!DOCTYPE HTML><html><head><title>文件上传</title></head><body><form action="${pageContext.request.contextPath}/servlet/uploadHandleServlet2" enctype="multipart/form-data" method="post"         上传用户:<input type="text"name="username"><br/>上传文件1:<input type="file" name="file1"><br/>上传文件2:<input type="file" name="file2"><br/><input type="submit" value="提交"></form></body></html>

在文件上传的页面要用enctype="multipart/form-data" method="post"来表示进行文件上传。

  2、处理文件上传的Servlet

public class UploadHandleServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");File file = new File(savePath);if(!file.exists()&&!file.isDirectory()){System.out.println("目录或文件不存在!");file.mkdir();}//消息提示String message = "";try {//使用Apache文件上传组件处理文件上传步骤://1、创建一个DiskFileItemFactory工厂DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();//2、创建一个文件上传解析器ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);//解决上传文件名的中文乱码fileUpload.setHeaderEncoding("UTF-8");//3、判断提交上来的数据是否是上传表单的数据if(!fileUpload.isMultipartContent(request)){//按照传统方式获取数据return;}//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项List<FileItem> list = fileUpload.parseRequest(request);for (FileItem item : list) {//如果fileitem中封装的是普通输入项的数据if(item.isFormField()){String name = item.getFieldName();//解决普通输入项的数据的中文乱码问题String value = item.getString("UTF-8");String value1 = new String(name.getBytes("iso8859-1"),"UTF-8");System.out.println(name+"  "+value);System.out.println(name+"  "+value1);}else{//如果fileitem中封装的是上传文件,得到上传的文件名称,String fileName = item.getName();System.out.println(fileName);if(fileName==null||fileName.trim().equals("")){continue;}//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:  c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt//处理获取到的上传文件的文件名的路径部分,只保留文件名部分fileName = fileName.substring(fileName.lastIndexOf(File.separator)+1);//获取item中的上传文件的输入流InputStream is = item.getInputStream();//创建一个文件输出流FileOutputStream fos = new FileOutputStream(savePath+File.separator+fileName);//创建一个缓冲区byte buffer[] = new byte[1024];//判断输入流中的数据是否已经读完的标识int length = 0;//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据while((length = is.read(buffer))>0){//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中fos.write(buffer, 0, length);}//关闭输入流is.close();//关闭输出流fos.close();//删除处理文件上传时生成的临时文件item.delete();message = "文件上传成功";}}} catch (FileUploadException e) {// TODO Auto-generated catch blocke.printStackTrace();message = "文件上传失败";}request.setAttribute("message",message);request.getRequestDispatcher("/message.jsp").forward(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}

3、文件上传的细节

  上述的代码虽然可以成功将文件上传到服务器上面的指定目录当中,但是文件上传功能有许多需要注意的小细节问题,以下列出的几点需要特别注意的:

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

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

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

  (4)、要限制上传文件的最大值。

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

  4、改进后的servlet

public class UploadHandleServlet1 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");//上传时生成的临时文件保存目录String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");File file = new File(tempPath);if(!file.exists()&&!file.isDirectory()){System.out.println("目录或文件不存在!");file.mkdir();}//消息提示String message = "";try {//使用Apache文件上传组件处理文件上传步骤://1、创建一个DiskFileItemFactory工厂DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();//设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。diskFileItemFactory.setSizeThreshold(1024*100);//设置上传时生成的临时文件的保存目录diskFileItemFactory.setRepository(file);//2、创建一个文件上传解析器ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);//解决上传文件名的中文乱码fileUpload.setHeaderEncoding("UTF-8");//监听文件上传进度fileUpload.setProgressListener(new ProgressListener(){public void update(long pBytesRead, long pContentLength, int arg2) {System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead);}});//3、判断提交上来的数据是否是上传表单的数据if(!fileUpload.isMultipartContent(request)){//按照传统方式获取数据return;}//设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MBfileUpload.setFileSizeMax(1024*1024);//设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MBfileUpload.setSizeMax(1024*1024*10);//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项List<FileItem> list = fileUpload.parseRequest(request);for (FileItem item : list) {//如果fileitem中封装的是普通输入项的数据if(item.isFormField()){String name = item.getFieldName();//解决普通输入项的数据的中文乱码问题String value = item.getString("UTF-8");String value1 = new String(name.getBytes("iso8859-1"),"UTF-8");System.out.println(name+"  "+value);System.out.println(name+"  "+value1);}else{//如果fileitem中封装的是上传文件,得到上传的文件名称,String fileName = item.getName();System.out.println(fileName);if(fileName==null||fileName.trim().equals("")){continue;}//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:  c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt//处理获取到的上传文件的文件名的路径部分,只保留文件名部分fileName = fileName.substring(fileName.lastIndexOf(File.separator)+1);//得到上传文件的扩展名String fileExtName = fileName.substring(fileName.lastIndexOf(".")+1);if("zip".equals(fileExtName)||"rar".equals(fileExtName)||"tar".equals(fileExtName)||"jar".equals(fileExtName)){request.setAttribute("message", "上传文件的类型不符合!!!");request.getRequestDispatcher("/message.jsp").forward(request, response);return;}//如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法System.out.println("上传文件的扩展名为:"+fileExtName);//获取item中的上传文件的输入流InputStream is = item.getInputStream();//得到文件保存的名称fileName = mkFileName(fileName);//得到文件保存的路径String savePathStr = mkFilePath(savePath, fileName);System.out.println("保存路径为:"+savePathStr);//创建一个文件输出流FileOutputStream fos = new FileOutputStream(savePathStr+File.separator+fileName);//创建一个缓冲区byte buffer[] = new byte[1024];//判断输入流中的数据是否已经读完的标识int length = 0;//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据while((length = is.read(buffer))>0){//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中fos.write(buffer, 0, length);}//关闭输入流is.close();//关闭输出流fos.close();//删除处理文件上传时生成的临时文件item.delete();message = "文件上传成功";}}} catch (FileUploadBase.FileSizeLimitExceededException e) {e.printStackTrace();request.setAttribute("message", "单个文件超出最大值!!!");request.getRequestDispatcher("/message.jsp").forward(request, response);return;}catch (FileUploadBase.SizeLimitExceededException e) {e.printStackTrace();request.setAttribute("message", "上传文件的总的大小超出限制的最大值!!!");request.getRequestDispatcher("/message.jsp").forward(request, response);return;}catch (FileUploadException e) {// TODO Auto-generated catch blocke.printStackTrace();message = "文件上传失败";}request.setAttribute("message",message);request.getRequestDispatcher("/message.jsp").forward(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}//生成上传文件的文件名,文件名以:uuid+"_"+文件的原始名称public String mkFileName(String fileName){return UUID.randomUUID().toString()+"_"+fileName;}public String mkFilePath(String savePath,String fileName){//得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址int hashcode = fileName.hashCode();int dir1 = hashcode&0xf;int dir2 = (hashcode&0xf0)>>4;//构造新的保存目录String dir = savePath + "\\" + dir1 + "\\" + dir2;//File既可以代表文件也可以代表目录File file = new File(dir);if(!file.exists()){file.mkdirs();}return dir;}}

5、如果在文件上传中IO流成为了系统的性能瓶颈,可以考虑使用NIO来提高性能。改进servlet代码如下:

public class UploadHandleServlet2 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");//上传时生成的临时文件保存目录String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");File file = new File(tempPath);if(!file.exists()&&!file.isDirectory()){System.out.println("目录或文件不存在!");file.mkdir();}//消息提示String message = "";try {//使用Apache文件上传组件处理文件上传步骤://1、创建一个DiskFileItemFactory工厂DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();//设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。diskFileItemFactory.setSizeThreshold(1024*100);//设置上传时生成的临时文件的保存目录diskFileItemFactory.setRepository(file);//2、创建一个文件上传解析器ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);//解决上传文件名的中文乱码fileUpload.setHeaderEncoding("UTF-8");//监听文件上传进度fileUpload.setProgressListener(new ProgressListener(){public void update(long pBytesRead, long pContentLength, int arg2) {System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead);}});//3、判断提交上来的数据是否是上传表单的数据if(!fileUpload.isMultipartContent(request)){//按照传统方式获取数据return;}//设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MBfileUpload.setFileSizeMax(1024*1024);//设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MBfileUpload.setSizeMax(1024*1024*10);//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项List<FileItem> list = fileUpload.parseRequest(request);for (FileItem item : list) {//如果fileitem中封装的是普通输入项的数据if(item.isFormField()){String name = item.getFieldName();//解决普通输入项的数据的中文乱码问题String value = item.getString("UTF-8");String value1 = new String(name.getBytes("iso8859-1"),"UTF-8");System.out.println(name+"  "+value);System.out.println(name+"  "+value1);}else{//如果fileitem中封装的是上传文件,得到上传的文件名称,String fileName = item.getName();System.out.println(fileName);if(fileName==null||fileName.trim().equals("")){continue;}//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:  c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt//处理获取到的上传文件的文件名的路径部分,只保留文件名部分fileName = fileName.substring(fileName.lastIndexOf(File.separator)+1);//得到上传文件的扩展名String fileExtName = fileName.substring(fileName.lastIndexOf(".")+1);if("zip".equals(fileExtName)||"rar".equals(fileExtName)||"tar".equals(fileExtName)||"jar".equals(fileExtName)){request.setAttribute("message", "上传文件的类型不符合!!!");request.getRequestDispatcher("/message.jsp").forward(request, response);return;}//如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法System.out.println("上传文件的扩展名为:"+fileExtName);//获取item中的上传文件的输入流InputStream fis = item.getInputStream();//得到文件保存的名称fileName = mkFileName(fileName);//得到文件保存的路径String savePathStr = mkFilePath(savePath, fileName);System.out.println("保存路径为:"+savePathStr);//创建一个文件输出流FileOutputStream fos = new FileOutputStream(savePathStr+File.separator+fileName);//获取读通道FileChannel readChannel = ((FileInputStream)fis).getChannel();//获取读通道FileChannel writeChannel = fos.getChannel();//创建一个缓冲区ByteBuffer buffer = ByteBuffer.allocate(1024);//判断输入流中的数据是否已经读完的标识int length = 0;//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据while(true){buffer.clear();int len = readChannel.read(buffer);//读入数据if(len < 0){break;//读取完毕}buffer.flip();writeChannel.write(buffer);//写入数据}//关闭输入流fis.close();//关闭输出流fos.close();//删除处理文件上传时生成的临时文件item.delete();message = "文件上传成功";}}} catch (FileUploadBase.FileSizeLimitExceededException e) {e.printStackTrace();request.setAttribute("message", "单个文件超出最大值!!!");request.getRequestDispatcher("/message.jsp").forward(request, response);return;}catch (FileUploadBase.SizeLimitExceededException e) {e.printStackTrace();request.setAttribute("message", "上传文件的总的大小超出限制的最大值!!!");request.getRequestDispatcher("/message.jsp").forward(request, response);return;}catch (FileUploadException e) {// TODO Auto-generated catch blocke.printStackTrace();message = "文件上传失败";}request.setAttribute("message",message);request.getRequestDispatcher("/message.jsp").forward(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}//生成上传文件的文件名,文件名以:uuid+"_"+文件的原始名称public String mkFileName(String fileName){return UUID.randomUUID().toString()+"_"+fileName;}public String mkFilePath(String savePath,String fileName){//得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址int hashcode = fileName.hashCode();int dir1 = hashcode&0xf;int dir2 = (hashcode&0xf0)>>4;//构造新的保存目录String dir = savePath + "\\" + dir1 + "\\" + dir2;//File既可以代表文件也可以代表目录File file = new File(dir);if(!file.exists()){file.mkdirs();}return dir;}}

·        文件下载

  1、列出提供下载的文件资源

  要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作,编写一个ListFileServlet,用于列出Web应用系统中所有下载文件。

  ListFileServlet代码如下

public class ListFileServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub//获取上传文件的目录String uploadFilePath = this.getServletContext().getRealPath("/WEB-INF/upload");//存储要下载的文件名Map<String, String> fileMap = new HashMap<String, String>();//递归遍历filepath目录下的所有文件和目录,将文件的文件名存储到map集合中fileList(new File(uploadFilePath),fileMap);//将Map集合发送到listfile.jsp页面进行显示request.setAttribute("fileMap", fileMap);request.getRequestDispatcher("/listfile.jsp").forward(request, response);}//递归遍历指定目录下的所有文件public void fileList(File file,Map fileMap){//如果file代表的不是一个文件,而是一个目录if(!file.isFile()){//列出该目录下的所有文件和目录File[] files = file.listFiles();//遍历files[]数组for (File file2 : files) {System.out.println(file2.getName());//递归fileList(file2, fileMap);}}else{/* 处理文件名,上传后的文件是以uuid_文件名的形式去重新命名的,去除文件名的uuid_部分file.getName().indexOf("_")检索字符串中第一次出现"_"字符的位置,如果文件名类似于:9349249849-88343-8344_阿_凡_达.avi那么file.getName().substring(file.getName().indexOf("_")+1)处理之后就可以得到阿_凡_达.avi部分*/String realName = file.getName().substring(file.getName().lastIndexOf("_")+1);//file.getName()得到的是文件的原始名称,这个名称是唯一的,因此可以作为key,realName是处理过后的名称,有可能会重复fileMap.put(file.getName(), realName);}}}

说明一下,一般文件路径在数据库中保存,然后再数据库中查询结果在页面显示。

  listfile.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE HTML><html><head><title>下载文件显示页面</title></head><body><!-- 遍历Map集合 --><c:forEach var="me" items="${fileMap}"><c:url value="/servlet/downLoadServlet" var="downurl"><c:param name="filename" value="${me.key}"></c:param></c:url>${me.value}<a href="${downurl}">下载</a><br/></c:forEach></body></html>

2、文件下载

  DownLoadServlet的代码如下:

public class DownLoadServlet extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//得到要下载的文件名String fileName = request.getParameter("filename");fileName = new String(fileName.getBytes("iso8859-1"),"UTF-8");//上传的文件都是保存在/WEB-INF/upload目录下的子目录当中String fileSaveRootPath=this.getServletContext().getRealPath("/WEB-INF/upload");//        处理文件名String realname = fileName.substring(fileName.indexOf("_")+1);//通过文件名找出文件的所在目录String path = findFileSavePathByFileName(fileName,fileSaveRootPath);//得到要下载的文件File file = new File(path+File.separator+fileName);//如果文件不存在if(!file.exists()){request.setAttribute("message", "您要下载的资源已被删除!!");request.getRequestDispatcher("/message.jsp").forward(request, response);return;}//设置响应头,控制浏览器下载该文件response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));//读取要下载的文件,保存到文件输入流FileInputStream fis = new FileInputStream(path + File.separator + fileName);//创建输出流OutputStream fos = response.getOutputStream();//设置缓存区ByteBuffer buffer = ByteBuffer.allocate(1024);//输入通道FileChannel readChannel = fis.getChannel();//输出通道FileChannel writeChannel = ((FileOutputStream)fos).getChannel();while(true){buffer.clear();int len = readChannel.read(buffer);//读入数据if(len < 0){break;//传输结束}buffer.flip();writeChannel.write(buffer);//写入数据}//关闭输入流fis.close();//关闭输出流fos.close();}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}//通过文件名和存储上传文件根目录找出要下载的文件的所在路径public String findFileSavePathByFileName(String fileName,String fileSaveRootPath){int hashcode = fileName.hashCode();int dir1 = hashcode&0xf;int dir2 = (hashcode&0xf0)>>4;String dir = fileSaveRootPath + "\\" + dir1 + "\\" + dir2;File file = new File(dir);if(!file.exists()){file.mkdirs();}return dir;}}

3、如果IO成为系统的瓶颈,可以考虑使用NIO来实现下载,提供系统性能,改进后的DownloadServlet代码如下:

public class DownLoadServlet1 extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//得到要下载的文件名String fileName = request.getParameter("filename");fileName = new String(fileName.getBytes("iso8859-1"),"UTF-8");//上传的文件都是保存在/WEB-INF/upload目录下的子目录当中String fileSaveRootPath=this.getServletContext().getRealPath("/WEB-INF/upload");//        处理文件名String realname = fileName.substring(fileName.indexOf("_")+1);//通过文件名找出文件的所在目录String path = findFileSavePathByFileName(fileName,fileSaveRootPath);//得到要下载的文件File file = new File(path+File.separator+fileName);//如果文件不存在if(!file.exists()){request.setAttribute("message", "您要下载的资源已被删除!!");request.getRequestDispatcher("/message.jsp").forward(request, response);return;}//设置响应头,控制浏览器下载该文件response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));//读取要下载的文件,保存到文件输入流FileInputStream in = new FileInputStream(path + File.separator + fileName);//创建输出流OutputStream os = response.getOutputStream();//设置缓存区byte[] bytes = new byte[1024];int len = 0;while((len = in.read(bytes))>0){os.write(bytes);}//关闭输入流in.close();//关闭输出流os.close();}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}//通过文件名和存储上传文件根目录找出要下载的文件的所在路径public String findFileSavePathByFileName(String fileName,String fileSaveRootPath){int hashcode = fileName.hashCode();int dir1 = hashcode&0xf;int dir2 = (hashcode&0xf0)>>4;String dir = fileSaveRootPath + "\\" + dir1 + "\\" + dir2;File file = new File(dir);if(!file.exists()){file.mkdirs();}return dir;}}

功能与效果展示:

树形目录导航。您可以通过树型目录导航和路径导航栏快速跳转到指定目录。在跳转后树型目录将会自动选中当前的目录。

路径导航,点击根目录按钮便可返根目录

文件和目录重命名

点击删除按钮

点击确定后,页面中的文件消失

批量上传文件

粘贴上传

复制文件夹、文件或图片

在页面中选择好相应的上传目录,点击粘贴上传按钮,数据即可快速开始上传

批量上传文件和文件夹

数据库记录

文件和目录下载

批量下载

同时选择多个需要下载的文件

然后点击下载按钮,设置下载目录文件夹

点击全部下载,开始下载

自动加载未上传完的任务。在刷新浏览器或重启电脑后仍然可以自动加载未完成的任务。

下载完成后打开我们设置的下载目录文件夹,发现需下载的文件或文件夹确认已下载成功,经确认文件夹内的内容与下载文件夹内容一致

数据库记录

控件包下载:
cab(x86):http://t.cn/Ai9pmG8S

cab(x64):http://t.cn/Ai9pm04B

xpi:http://t.cn/Ai9pubUc

crx:http://t.cn/Ai9pmrcy

exe:http://t.cn/Ai9puobe

示例下载:

asp.net:http://t.cn/Ai9pue4A

jsp-eclipse:http://t.cn/Ai9p3LSx

jsp-myeclipse:http://t.cn/Ai9p3IdC

php: http://t.cn/Ai9p3CKQ

在线教程:
asp.net-文件管理器教程:http://j.mp/2MLoQWf

jsp-文件管理器教程:http://j.mp/2WJ2Y1m

php-文件管理器教程:http://j.mp/2MudPs3

java文件实现文件的上传和下载相关推荐

  1. Linux命令scp用于远程文件的拷贝(上传和下载)

    3_Linux命令scp用于远程文件的拷贝(上传和下载) 文章目录 1.SCP简介 2.SCP使用 2.1.命令格式: 2.2.命令功能: 2.3.命令参数: 3.使用实例: 如何将本地文件通过终端上 ...

  2. java http 下载文件_JAVA通过HttpURLConnection 上传和下载文件的方法

    本文介绍了JAVA通过HttpURLConnection 上传和下载文件的方法,分享给大家,具体如下: HttpURLConnection文件上传 HttpURLConnection采用模拟浏览器上传 ...

  3. php将图片导入,php中图片文件的导入,上传与下载

    ---------------------------------------------图片的导入-------------------------------------------------- ...

  4. 大数据Linux命令之命令安装、文件编辑、软件上传与下载

    一.如何找命令 当我们输入一个系统中没有安装到的命令时,会抛出提示:command not found Linux 下,我们常使用 cd ,grep,vi 等命令,有时候我们要查到这些命令所在的位置, ...

  5. Java中Jsp和Servlet上传和下载文件

    上传: 前端页面: <%@ page contentType="text/html;charset=UTF-8" language="java" %> ...

  6. java spring文件下载_SpringMVC实现文件上传和下载的工具类

    本文主要目的是记录自己基于SpringMVC实现的文件上传和下载的工具类的编写,代码经过测试可以直接运行在以后的项目中. 开发的主要思路是对上传和下载文件进行抽象,把上传和下载的核心功能抽取出来分装成 ...

  7. asp 调用java文件上传_用asp实现文件浏览、上传、下载的程序

    可以放在服务器上,对服务器上的文件进行浏览.上传.下载,可下载文件源码. 把下所有代码入在一个文件里即可,文件的后缀要为asp. thedir = request("thedir" ...

  8. Javaweb之文件上传与下载

    Javaweb之文件上传与下载 1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图 ...

  9. java 上传 excel_Java对Excel表格的上传和下载处理方法

    Excel表格文件的上传和下载,java中涉及到文件肯定会有io流的知识. 而excel文件就要涉及到poi技术,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为 ...

  10. python sftp_Python使用sftp实现上传和下载功能(实例代码)

    在Python中可以使用paramiko模块中的sftp登陆远程主机,实现上传和下载功能. 1.功能实现 根据输入参数判断是文件还是目录,进行上传和下载 本地参数local需要与远程参数remote类 ...

最新文章

  1. 一文应用 AOP | 最全选型考量 + 边剖析经典开源库边实践,美滋滋
  2. LU 分解 (LU Decomposition)
  3. Android实现仿美图秀秀给图片加框
  4. 关于html5的几个新标签在IE9之前不支持的解决办法
  5. 理解 C++ 的 Memory Order 以及 atomic 与并发程序的关系
  6. 备战2020年双十一,刷喵币靠这一个自动化脚本就够了!
  7. python新浪api_python调用新浪微博API项目实践
  8. Spark SQL 内置函数(六)Window Functions(基于 Spark 3.2.0)
  9. 开启Win7快速启动栏
  10. 计算机硬盘空间不足解决办法,3种方法解决Windows10硬盘空间不够的问题
  11. 函数的应用及其解析大全!
  12. JAVA:正则表达式(入门)
  13. iOS9不受信任的企业开发人员,无法信任
  14. 直播系统开发应有的引流功能
  15. 《软技能-代码之外的生存指南》的读后感
  16. 牛客网-Verilog篇
  17. 怎么用python读取excel图_Python如何读取excel中的图片
  18. linux下grep同时匹配多个单词,Linux下使用grep命令搜索多个单词的方法
  19. Java IO流--数据读写(字符/字节流/二进制文件)
  20. 计算机网络——2.3奈氏准则、香农定律

热门文章

  1. java学习总结之集合框架
  2. 一次偶然的CobaltStrike木马钓鱼邮件分析
  3. 大数据分析实战之异构数据源联合分析业务创新实践
  4. autojs人像变换
  5. 仿照Kafka,从零开始自实现 MQ
  6. 仿照京东导航条html+css
  7. 硬盘数据丢失怎么恢复?分享固态硬盘恢复数据的4个方法
  8. PHP编写modbus,php – CRC-CCITT转CRC16 Modbus实现
  9. jenkins下载插件失败
  10. 如果圆桌骑士有特殊情况(Knights of the Round Table)