精华内容
下载资源
问答
  • SpringMVC文件上传,多文件上传实例

    千次下载 热门讨论 2014-03-01 20:28:21
    在上一篇SpringMVC基础教程的源码基础上增加了文件上传,多文件上传
  • 文件下载 //下载单个文件 public void downloadFile(HttpServletResponse response){ String path = "D:\test\ce\1.txt" File file = new File(path); if(file.exists()){ String fil...

    微信搜索:“二十同学” 公众号,欢迎关注一条不一样的成长之路

    单文件下载

    //下载单个文件
    public void downloadFile(HttpServletResponse response){
            String path = "D:\test\ce\1.txt"
            File file = new File(path);
            if(file.exists()){
    
                String fileName = file.getName();
                response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
                download(response,file);
    
            }
        }
    
    
    public void download(HttpServletResponse response,File file){
    
    
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            OutputStream os = null;
    
            try {
                os = response.getOutputStream();
                fis = new FileInputStream(file);
                bis = new BufferedInputStream(fis);
                byte[] buffer = new byte[bis.available()];
                int i = bis.read(buffer);
                while(i != -1){
                    os.write(buffer, 0, i);
                    i = bis.read(buffer);
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                bis.close();
                fis.close();
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    多文件压缩下载

    //多个文件,压缩成zip后下载
    public void downloadMoreFile(HttpServletResponse response) {
    
            
            String test1= "D:\test\ce\1.txt";
            String test2= "D:\test\ce\2.txt";
    
            File tfile= new File(test1);
            File cfile= new File(test2);
    
            List<File> files = new ArrayList<>();
            files.add(tfile);
            files.add(cfile);
            if (tfile.exists() && cfile.exists()) {
    
                String zipTmp = "D:\test\ce\1.zip";
                zipd(zipTmp,files,response);
    
             
            }
        }
    
    public void zipd(String zipTmp,List<File> files,HttpServletResponse response){
            File zipTmpFile = new File(zipTmp);
            try {
                if (zipTmpFile.exists()) {
                    zipTmpFile.delete();
                }
                zipTmpFile.createNewFile();
    
                response.reset();
                // 创建文件输出流
                FileOutputStream fous = new FileOutputStream(zipTmpFile);
                ZipOutputStream zipOut = new ZipOutputStream(fous);
                zipFile(files, zipOut);
                zipOut.close();
                fous.close();
                downloadZip(zipTmpFile, response);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
     
        //files打成压缩包
        public void zipFile(List files, ZipOutputStream outputStream) {
            int size = files.size();
            for (int i = 0; i < size; i++) {
                File file = (File) files.get(i);
                zipFile(file, outputStream);
            }
        }
    
     
        public void zipFile(File inputFile, ZipOutputStream ouputStream) {
            try {
                if (inputFile.exists()) {
                    if (inputFile.isFile()) {
                        FileInputStream IN = new FileInputStream(inputFile);
                        BufferedInputStream bins = new BufferedInputStream(IN, 512);
                        ZipEntry entry = new ZipEntry(inputFile.getName());
                        ouputStream.putNextEntry(entry);
    
                        int nNumber;
                        byte[] buffer = new byte[512];
                        while ((nNumber = bins.read(buffer)) != -1) {
                            ouputStream.write(buffer, 0, nNumber);
                        }
         
                        bins.close();
                        IN.close();
                    } else {
                        try {
                            File[] files = inputFile.listFiles();
                            for (int i = 0; i < files.length; i++) {
                                zipFile(files[i], ouputStream);
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    public static HttpServletResponse downloadZip(File file, HttpServletResponse response) {
            if (file.exists() == false) {
                System.out.println("待压缩的文件目录:" + file + "不存在.");
            } else {
                try {
                    // 以流的形式下载文件。
                    InputStream fis = new BufferedInputStream(new FileInputStream(file.getPath()));
                    byte[] buffer = new byte[fis.available()];
                    fis.read(buffer);
                    fis.close();
                    // 清空response
                    response.reset();
    
                    OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
                    response.setContentType("application/octet-stream");
    
                    // 如果输出的是中文名的文件,在此处就要用URLEncoder.encode方法进行处理
                    response.setHeader("Content-Disposition",
                            "attachment;filename=" + new String(file.getName().getBytes("GB2312"), "ISO8859-1"));
                    toClient.write(buffer);
                    toClient.flush();
                    toClient.close();
                } catch (Exception ex) {
                    ex.printStackTrace();
                } finally {
                    try {
                        File f = new File(file.getPath());
                        f.delete();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            return response;
        }
    

     

    展开全文
  • SWFUpload实现多文件上传

    千次下载 热门讨论 2014-01-17 15:48:13
    SWFUpload实现多文件上传,servlet+jsp
  • springboot-单文件多文件下载Zip

    万次阅读 2019-12-09 13:17:52
    2.把服务器上要下载的文件写入该压缩文件 3.把压缩文件通过输出流传输给客户端(注意:必须在zipoutputstream流关闭后,否则下载下的文件会报不可预料的压缩文件末端) 4.删除服务器上的临时文件文件 public ...

    原理:
    1.创建压缩流写到服务器上的压缩文件(临时文件)
    2.把服务器上要下载的多个文件写入该压缩文件
    3.把压缩文件通过输出流传输给客户端(注意:必须在zipoutputstream流关闭后,否则下载下的文件会报不可预料的压缩文件末端)
    4.删除服务器上的临时文件

    单文件

    public void downImg(HttpServletResponse response,String filename,String path ){
            if (filename != null) {
                FileInputStream is = null;
                BufferedInputStream bs = null;
                OutputStream os = null;
                try {
                    File file = new File(path);
                    if (file.exists()) {
                        //设置Headers
                        response.setHeader("Content-Type","application/octet-stream");
                        //设置下载的文件的名称-该方式已解决中文乱码问题
                        response.setHeader("Content-Disposition","attachment;filename=" +  new String( filename.getBytes("gb2312"), "ISO8859-1" ));
                        is = new FileInputStream(file);
                        bs =new BufferedInputStream(is);
                        os = response.getOutputStream();
                        byte[] buffer = new byte[1024];
                        int len = 0;
                        while((len = bs.read(buffer)) != -1){
                            os.write(buffer,0,len);
                        }
                    }else{
                        String error = Base64Util.encode("下载的文件资源不存在");
                        response.sendRedirect("/imgUpload/imgList?error="+error);
                    }
                }catch(IOException ex){
                    ex.printStackTrace();
                }finally {
                    try{
                        if(is != null){
                            is.close();
                        }
                        if( bs != null ){
                            bs.close();
                        }
                        if( os != null){
                            os.flush();
                            os.close();
                        }
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                }
            }
        }
    
    

    多文件下载:下载的是zip格式
    前段js代码+后端controller代码

    /**
         * 图片下载
         */
        function downloadimg() {
            //获取所有被选的图片的名称与绝对路径放入数组
            var list = $(".activecheck");
            var imgNameList = [];
            var imgUrlList = [];
            for(var i = 0;i<list.length;i++){
                var b = $(list[i].childNodes[2]).attr("data-url");
                imgNameList.push(list[i].childNodes[3].innerText);//图片名称
                imgUrlList.push(b);//图片绝对路径
            }
            var paths =  encodeURI(encodeURI(imgUrlList));
            var names = encodeURI(encodeURI(imgNameList));
            //将名称传入后台
            window.location.href = "/imgUpload/imgdownload?names="+names+"&paths="+paths;
        }
    
    
      /**
         * 下载
         * @param response
         */
        @RequestMapping(value = "/imgdownload", method = RequestMethod.GET)
        public void imgDownload(@SessionAttribute(MyInterceptor.SESSION_KEY) SessionInfo info,HttpServletResponse response,String [] names,String [] paths) {
            //存放--服务器上zip文件的目录
            String directory = "D:\\repository\\"+info.getName();
            File directoryFile=new File(directory);
            if(!directoryFile.isDirectory() && !directoryFile.exists()){
                directoryFile.mkdirs();
            }
            //设置最终输出zip文件的目录+文件名
            SimpleDateFormat formatter  = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
            String zipFileName = formatter.format(new Date())+".zip";
            String strZipPath = directory+"\\"+zipFileName;
     
            ZipOutputStream zipStream = null;
            FileInputStream zipSource = null;
            BufferedInputStream bufferStream = null;
            File zipFile = new File(strZipPath);
            try{
                //构造最终压缩包的输出流
                zipStream = new ZipOutputStream(new FileOutputStream(zipFile));
                for (int i = 0; i<paths.length ;i++){
                    //解码获取真实路径与文件名
                    String realFileName = java.net.URLDecoder.decode(names[i],"UTF-8");
                    String realFilePath = java.net.URLDecoder.decode(paths[i],"UTF-8");
                    File file = new File(realFilePath);
                    //TODO:未对文件不存在时进行操作,后期优化。
                    if(file.exists())
                    {
                        zipSource = new FileInputStream(file);//将需要压缩的文件格式化为输入流
                        /**
                         * 压缩条目不是具体独立的文件,而是压缩包文件列表中的列表项,称为条目,就像索引一样这里的name就是文件名,
                         * 文件名和之前的重复就会导致文件被覆盖
                         */
                        ZipEntry zipEntry = new ZipEntry(realFileName);//在压缩目录中文件的名字
                        zipStream.putNextEntry(zipEntry);//定位该压缩条目位置,开始写入文件到压缩包中
                        bufferStream = new BufferedInputStream(zipSource, 1024 * 10);
                        int read = 0;
                        byte[] buf = new byte[1024 * 10];
                        while((read = bufferStream.read(buf, 0, 1024 * 10)) != -1)
                        {
                            zipStream.write(buf, 0, read);
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //关闭流
                try {
                    if(null != bufferStream) bufferStream.close();
                    if(null != zipStream){
                        zipStream.flush();
                        zipStream.close();
                    }
                    if(null != zipSource) zipSource.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //判断系统压缩文件是否存在:true-把该压缩文件通过流输出给客户端后删除该压缩文件  false-未处理
            if(zipFile.exists()){
                downImg(response,zipFileName,strZipPath);
                zipFile.delete();
            }
        }
    
    
    展开全文
  • SpringMVC单文件上传、多文件上传、文件列表显示、文件下载,具体效果和过程看博文http://blog.csdn.net/evankaka/article/details/45826697
  • 程序员在做web等项目的时候,往往都需要添加文件上传、下载、删除的功能,有时是单文件,有时多文件批量 操作,而这些功能的代码程序员可以自己收藏起来当成工具使用,这样,程序员在进行程序设计的时候就会事半功倍...

    一、前言
      程序员在做web等项目的时候,往往都需要添加文件上传、下载、删除的功能,有时是单文件,有时多文件批量 操作,而这些功能的代码程序员可以自己收藏起来当成工具使用,这样,程序员在进行程序设计的时候就会事半功倍 了,那么接下来的博客将会介绍各个框架的文件上传和下载功能的使用方法。
      这篇博客的重点放在各个框架都能适用的文件下载功能代码,话不多说,直接切入主题:

    二、实例

      1.一般需要加入的jar包:
       commons.fileupload-1.2.1.jar和commons.io-1.4.0.jar,点击下载jar包


       2.方法实例:

        /**
         * -普通java文件下载方法,适用于所有框架 
         * -注意:
         *     1.  response.setContentType设置下载内容类型,常用下载类型:
         *         application/octet-stream(二进制流,未知文件类型);
         *         application/vnd.ms-excel(excel);
         *         text/plain(纯文本); text/xml(xml);text/html(html);image/gif(GIF);image/jpeg(JPG)等
         *         如果不写,则匹配所有;
         *     2.  response.setHeader("Content-Disposition","attachment; filename="+fileName +".zip"); 设置下载文件名;
         *         文件名可能会出现乱码,解决名称乱码:fileName  = new String(fileName.getBytes(), "iso8859-1");
         */ 
    	public String downloadFilesTest(HttpServletRequest request,HttpServletResponse res) throws IOException {
    	    try{
    			//获取文件根目录,不同框架获取的方式不一样,可自由切换  
    		    String basePath = request.getSession().getServletContext().getRealPath("/upload/fileDir");  
    	
    		    //获取文件名称(包括文件格式)  
    		    String fileName = "1.jpg";  
    	
    		    //组合成完整的文件路径  
    		    String targetPath = basePath+File.separator+fileName;  
    	
    		    //模拟多一个文件,用于测试多文件批量下载  
    		    String targetPath1 = basePath+File.separator+"2.jpg";  
    		    //模拟文件路径下再添加个文件夹,验证穷举
    		    String targetPath2 = basePath+File.separator+"test";
    		    
    		    System.out.println("文件名:"+fileName);  
    		    System.out.println("文件路径:"+targetPath);  
    	
    		    //方法1:IO流实现下载的功能  
    		    res.setCharacterEncoding("UTF-8"); //设置编码字符
    		    res.setContentType("application/octet-stream;charset=UTF-8"); //设置下载内容类型
    		    res.setHeader("Content-disposition", "attachment;filename="+fileName);//设置下载的文件名称  
    		    OutputStream out = res.getOutputStream();   //创建页面返回方式为输出流,会自动弹出下载框   
    	
    	
    	/*	  //方法1-1:IO字节流下载,用于小文件  
    		    System.out.println("字节流下载");  
    		    InputStream is = new FileInputStream(targetPath);  //创建文件输入流  
    		    byte[] Buffer = new byte[2048];  //设置每次读取数据大小,即缓存大小  
    		    int size = 0;  //用于计算缓存数据是否已经读取完毕,如果数据已经读取完了,则会返回-1  
    		    while((size=is.read(Buffer)) != -1){  //循环读取数据,如果数据读取完毕则返回-1  
    		        out.write(Buffer, 0, size); //将每次读取到的数据写入客户端  
    		    }
    		    is.close();
    		    */  
    	    
    
    	/*	  //方法1-2:IO字符流下载,用于大文件  
    		    System.out.println("字符流");  
    		    File file = new File(targetPath);  //创建文件  
    		    FileInputStream fis=new FileInputStream(file);  //创建文件字节输入流  
    		    BufferedInputStream bis=new BufferedInputStream(fis); //创建文件缓冲输入流  
    		    byte[] buffer = new byte[bis.available()];//从输入流中读取不受阻塞
    			bis.read(buffer);//读取数据文件
    			bis.close();
    			out.write(buffer);//输出数据文件
    			out.flush();//释放缓存
    			out.close();//关闭输出流
    	*/   
    	
    	/*	  //方法1-3:将附件中多个文件进行压缩,批量打包下载文件  
    		    //创建压缩文件需要的空的zip包  
    		    String zipBasePath=request.getSession().getServletContext().getRealPath("/upload/zip");  
    		    String zipName = "temp.zip";
    		    String zipFilePath = zipBasePath+File.separator+zipName;  
    	
    		    //创建需要下载的文件路径的集合
    		    List<String> filePaths = new ArrayList<String>();  
    		    filePaths.add(targetPath);  
    		    filePaths.add(targetPath1); 
    		    filePaths.add(targetPath2);
    		    
    		    //压缩文件
    		    File zip = new File(zipFilePath);  
    		    if (!zip.exists()){     
    		        zip.createNewFile();     
    		    }
    		    //创建zip文件输出流  
    		    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zip));
    		    this.zipFile(zipBasePath,zipName, zipFilePath,filePaths,zos);
    		    zos.close();
    		    res.setHeader("Content-disposition", "attachment;filename="+zipName);//设置下载的压缩文件名称
    	
    		    //将打包后的文件写到客户端,输出的方法同上,使用缓冲流输出  
    		    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(zipFilePath));  
    		    byte[] buff = new byte[bis.available()];  
    		    bis.read(buff);
    		    bis.close();
    			out.write(buff);//输出数据文件
    			out.flush();//释放缓存
    			out.close();//关闭输出流
    	*/
    	    }catch(Exception e) {
    			e.printStackTrace();
    			res.reset();
    			res.setCharacterEncoding("UTF-8");
    			res.setContentType("text/html;charset=UTF-8"); 
    			res.getWriter().print("<div align=\"center\" style=\"font-size: 30px;font-family: serif;color: red;\">系统内部错误,下载未成功,请联系管理员!</div>"
    					+ "<div>错误信息:"+e.getMessage()+"</div>");
    			res.getWriter().flush();
    			res.getWriter().close();
    		}
    		return null;
    	}
    	
    	/**
    	 * 压缩文件
    	 * @param zipBasePath 临时压缩文件基础路径
    	 * @param zipName 临时压缩文件名称
    	 * @param zipFilePath 临时压缩文件完整路径
    	 * @param filePaths 需要压缩的文件路径集合
    	 * @throws IOException
    	 */
    	private String zipFile(String zipBasePath, String zipName, String zipFilePath, List<String> filePaths,ZipOutputStream zos) throws IOException {
    
    	    //循环读取文件路径集合,获取每一个文件的路径  
    	    for(String filePath : filePaths){  
    	        File inputFile = new File(filePath);  //根据文件路径创建文件  
    	        if(inputFile.exists()) { //判断文件是否存在  
                    if (inputFile.isFile()) {  //判断是否属于文件,还是文件夹  
                        //创建输入流读取文件  
                        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inputFile));  
    
                        //将文件写入zip内,即将文件进行打包  
                        zos.putNextEntry(new ZipEntry(inputFile.getName()));  
    
                        //写入文件的方法,同上                  
                        int size = 0;  
                        byte[] buffer = new byte[1024];  //设置读取数据缓存大小
                        while ((size = bis.read(buffer)) > 0) {  
                        	zos.write(buffer, 0, size);  
                        }  
                        //关闭输入输出流  
                        zos.closeEntry();  
                        bis.close(); 
                        
                    } else {  //如果是文件夹,则使用穷举的方法获取文件,写入zip  
                        try {  
                            File[] files = inputFile.listFiles();  
                            List<String> filePathsTem = new ArrayList<String>();  
                            for (File fileTem:files) {  
                            	filePathsTem.add(fileTem.toString());
                            }  
                            return zipFile(zipBasePath, zipName, zipFilePath, filePathsTem,zos);
                        } catch (Exception e) {  
                            e.printStackTrace();  
                        }  
                    }  
                }  
    	    }  
    	    return null;
    	} 
    

    三、总结

      1. 该方法结合了字节流、字符流进行单文件和多文件打包下载,方法1-1、方法1-2和方法1-3分别属于不同形式的下载方法,都是在方法1的基础之上进行的操作,三种方法不可同时使用,需要使用哪种类型的方法则去掉注释即可;

      2、实践是检验认识真理性的唯一标准,根据代码和注释多进行尝试,则很快就会明白其中的原理

    展开全文
  • 俺亲手写的: 1.支持多文件上传 2.带进度条 3.可以显示文件名称 4.可以实时显示已上传的大小 5.可以从队列中删除 6.各元素的样式都可以自己控制
  • Spring boot 多文件上传注意要点

    万次阅读 2018-09-20 18:11:14
    springboot多文件上传时,应注意以下要点: 1、多文件采用MultipartFile[ ]接收 2、单个文件信息对MultipartFile对象进行解析 3、上传文件大小spring.http.multipart.max-file-size设置 4、测试中上传目标目录的...

    springboot多文件上传时,应注意以下要点:

    1、多文件采用MultipartFile[ ]接收

    2、单个文件信息对MultipartFile对象进行解析

    3、上传文件大小spring.http.multipart.max-file-size设置

    4、测试中上传目标目录的设置

     

    下面我们通过一个示例来进行演示,其文件目录如下

    主要文件有上传控制类FileUploadController.java和上传页面uploads.html,附加springboot默认配置文件application.properties。success.html 和 error.html是上传成功或失败的跳转页面,这里不展示其代码。

    上传页面uploads.html

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
    <meta charset="UTF-8"></meta>
    <title>多文件上传示例</title>
    <link rel="stylesheet" th:href="@{css/bootstrap.min.css}" />
    <link rel="stylesheet" th:href="@{css/bootstrap-theme.min.css}"/> 
    <script type="text/javascript" th:src="@{js/jquery-1.11.0.min.js}"></script>
    <script type="text/javascript" th:src="@{js/bootstrap.min.js}"></script>
    </head>
    <body>
    <div class="panel panel-primary">
    	<div class="panel-heading">
    		<h3 class="panel-title">文件上传示例:多文件上传</h3>
    	</div>
    </div>
    <div class="container">
    	<div class="row">
    		<div class="col-md-8">
    			<form class="form-horizontal" action="uploads" enctype="multipart/form-data" method="post">
    				<div class="form-group">
    					<div class="input-group col-md-4">
    						<span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i></span>
    						<input class="form-control" placeholder="文件描述" type="text" name="descriptions" />
    						<input class="form-control" placeholder="文件描述" type="text" name="descriptions" />
    					</div>
    				</div>
    				<div class="form-group">
    					<div class="input-group col-md-4">
    						<span class="input-group-addon"><i class="glyphicon glyphicon-search"></i></span>
    						<input class="form-control" placeholder="请选择文件" type="file" name="files"/>
    						<input class="form-control" placeholder="请选择文件" type="file" name="files"/>
    					</div>
    				</div>
    				<div class="form-group">
    					<div class="col-md-4">
    						<div class="btn-group btn-group-justified" >
    							  <div class="btn-group" >
    							    <button type="submit" class="btn btn-success" id="submitbtn">
    							    	<span class="glyphicon glyphicon-share"></span>&nbsp;文件上传</button>
    							  </div>
    						</div>
    					</div>
    				</div>
    			</form>
    		</div>
    	</div>
    </div>
    </body>
    </html>

    相较于单文件上传,上面表单中有两个name标签属性,分别是descriptions和files,分别接收上传的文件描述和文件。如果把上面的多个描述框和上传控件都改为一个,则为单文件上传。

    上传控制类FileUploadController.java

    package com.example.fileupload.controller;
    
    import java.io.File;
    import java.io.IOException;
    import javax.servlet.http.HttpServletRequest;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.multipart.MultipartFile;
    
    /**
     * 多文件上传控制类
     * @author Administrator
     */
    @Controller
    public class FilesUploadController {
    	
    	// 读取application.properties文件中的自定义配置项
    	@Value("${spring.fileupload.destination}")
    	private String destination;
    	
    	@RequestMapping("/files")
    	public String index(){
    		return "uploads";
    	}
    	
    	/**
    	 * 多文件上传类
    	 * 文件会自动绑定到MultipartFile中
    	 * @param request 获取请求信息
    	 * @param description 文件描述
    	 * @param file 上传的文件
    	 * @return 上传成功或失败结果
    	 * @throws IOException 
    	 * @throws IllegalStateException 
    	 */
    	@PostMapping("/uploads")
    	public String filesUpload(HttpServletRequest request, 
    			@RequestParam("descriptions") String[] descriptions,
    			@RequestParam("files") MultipartFile[] files) throws IllegalStateException, IOException {
    		
    		// 获取文件描述参数 description,纯粹测试使用
    		if (null != descriptions && descriptions.length > 0) {
    			for (int i=0; i < descriptions.length; i++) {
    				String description = descriptions[i];
    				System.out.println("description" + i + " = " + description);
    			}
    		}
    		
    		// 构建上传文件的存放路径
    		String destionation = destination + File.separator + "upload";
    		System.out.println("destionation = " + destionation);
    					
    		// 如果文件不为空,写入上传路径,进行文件上传
    		if (null != files && files.length > 0) {
    			for (MultipartFile file : files) {
    				// 测试MultipartFile接口的各个方法
    				System.out.println("文件类型ContentType=" + file.getContentType());
    				System.out.println("文件组件名称Name=" + file.getName());
    				System.out.println("文件原名称OriginalFileName=" + file.getOriginalFilename());
    				System.out.println("文件大小Size=" + file.getSize() + "byte or " + file.getSize()/1024 + "KB");
    				saveFile(file, destionation);
    			}
    			return "success";
    		} else {
    			return "error";
    		}
    	}
    	
    	/**
    	 * 文件保存方法
    	 * @param file
    	 * @param destination
    	 * @throws IOException 
    	 * @throws IllegalStateException 
    	 */
    	private void saveFile(MultipartFile file, String destination) throws IllegalStateException, IOException {
    		// 获取上传的文件名称,并结合存放路径,构建新的文件名称
    		String filename = file.getOriginalFilename();
    		File filepath = new File(destination, filename);
    		
    		// 判断路径是否存在,不存在则新创建一个
    		if (!filepath.getParentFile().exists()) {
    			filepath.getParentFile().mkdirs();
    		}
    		
    		// 将上传文件保存到目标文件目录
    		file.transferTo(new File(destination + File.separator + filename));
    	}
    }
    

    解读点1、自定义配置项读取

    // 读取application.properties文件中的自定义配置项

    @Value("${spring.fileupload.destination}")
    private String destination;

    我们在application.properties文件中新增加spring.fileupload.destination=D:\\DEV_ENV配置项,该配置项可以通过@Value注解自动注入给@Value注解标注的属性。这里注意不同操作系统间的分隔符,我们这里是Windows系统,使用双反斜线 "\\"。

    解读点2、页面文件信息映射

    @RequestParam("descriptions") String[] descriptions, @RequestParam("files") MultipartFile[] files

    方法入参中descriptions 和 files 接收反射过来的页面的descriptions 和 files ,其实突然想到,页面的description和file标签位置可以调整下,调整到一行,就俨然一个上传功能的雏形了。

    解读点3、MultipartFile方法测试

    file.getContentType() 获取文件类型信息,如image/jpg、application/pdf等

    file.getName() 获取表单上传组件的name值,我们上面的<input type="file"  ... name="files"/> 该值变为files了

    file.getOriginalFilename() 获取原上传文件名称,有利于文件的保存、查找等

    file.getSize() 获取文件大小,默认单位是字节(byte),可以根据需要转换为千字节(KB)或兆(MB)

    application.properties文件

    spring.http.multipart.max-file-size=45MB
    spring.http.multipart.max-request-size=50MB
    spring.fileupload.destination=D:\\DEV_ENV

    spring.http.multipart.max-file-size 单个文件的最大大小控制

    spring.http.multipart.max-request-size 单次请求的所有文件的最大大小控制,主要用在多文件上传时

     

    下面进入测试

    场景1、双文件正常上传

    测试时,我们首先一个44.5MB的PDF文件和一个385byte的TXT文件,文件可以正常上传

    查看后台的打印信息

    description0 = jpa建表注释
    description1 = Tomcat权威指南
    destionation = D:\DEV_ENV\upload
    文件类型ContentType=text/plain
    文件组件名称Name=files
    文件原名称OriginalFileName=jpa建表注释.txt
    文件大小Size=385byte or 0KB
    文件类型ContentType=application/pdf
    文件组件名称Name=files
    文件原名称OriginalFileName=TOMCAT权威指南.pdf
    文件大小Size=46711873byte or 45617KB
    与我们期待的结果一致,PDF文件和TXT文件均上传成功,到指定的目录,可以正常打开查看

    场景2、双文件总大小超大,上传失败

    后台会报错,主要信息如下 

    org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (52507104) exceeds the configured maximum (52428800)] with root cause

    请求被拒,因为请求文件大小52507104byte超过了允许的最大文件大小52428800byte(即50MB)。

    场景3、文件名、目录名或卷标语法不正确

    2019-2-1测试发现该问题,以单独整理文章解释,请参考getOriginalFilename方法与“文件名、目录名或卷标语法不正确”

    以上是最近学习整理的关于多文件上传的内容,用文章予以记录,希望可以帮助到大家,同时对文章中可以改进的部分,欢迎大家留言批评斧正。谢谢。

     

    附带源码下载:springboot单文件和多文件上传

    展开全文
  • linux vim 编辑器之多文件多窗口编辑

    千次阅读 2017-11-26 22:10:09
    还好linux提供了多文件多窗口的模式。 同时打开多个文件vim filename1 filename2 filename3 ....多文件编辑按键:files 查看当前打开了哪些文件 :n 切换到下一个文件 :N 切换到上一个文件同时打开多个文件之后,就...
  • android 播放局域网共享多媒体文件

    千次下载 热门讨论 2013-03-31 22:52:56
    android 播放局域网共享多媒体文件
  • 将Python项目打包成EXE可执行文件(单文件,多文件,包含图片) 解决 将Python项目打包成EXE可执行文件(单文件,多文件,包含图片) 1.当我们写了一个Python的项目时,特别是一个GUI项目,我们特备希望它能成为一...
  • 【C语言】多文件编程

    万次阅读 多人点赞 2017-07-29 21:23:58
    多文件编程
  • Android阿里云OSS多文件同步上传和删除方案

    万次阅读 多人点赞 2016-08-04 17:16:29
    上个项目中使用的是阿里云OSS,查阅了官方文档,发现居然没有多文件上传相关说明文档,只有一个单文件异步上传的说明。既没有多文件上传,又没有同步上传,删除文件亦然,凌乱。想到之前做过的七牛云开发,决定用...
  • SWFUpload上传组件的一个完整的例子,后台由Struts2完成,有上传进度显示,可以多文件上传,如果你想使用SWFUpload组件但还不知道怎样使用,可以下载下来运行一下试试,看一下源码就知道了。
  • Linux C 多文件编译

    千次阅读 2017-11-02 22:09:56
    多文件编译 将工程目录下的每个源文件都编译(通过编译器)成对应的目标文件(Linux平台下为.o文件,是二进制的,但无法执行) ,然后将所有的目标文件和库文件链接在一起(通过链接器)构成最终的可执行文件 注意:...
  • Spirng,SpringBoot实现多文件上传(MultipartFile)

    万次阅读 多人点赞 2018-07-04 16:30:52
    引言:本例实现 jsp页面ajax多文件上传的多种方式 springBoot实现多文件上传: springBopo不需要引入commons-io.jar , commons-fileupload.jar俩个jar包,spring需要 一,maven:web包,jasper包, 二,jsp代码 1....
  • 平时使用网盘等工具的时候,总是多文件上传缓慢,总结一下问题 (1)千万不要上传Android的全体资源包 (2)多文件的时候一定要压缩。 分开压缩可以保持文件的完整性。 上传这就很棒了! ...
  • 问题:个excel文件导入(上传) 思路:由于文件选择只能单个文件选择,那么可以将excel文件一个一个上传到本地或服务器,将路径保存至数据库中,后台使用队列进行操作,即上传第一个文件时便在后台开启一条线程...
  • vim打开多窗口、多文件之间的切换

    万次阅读 2017-05-22 20:39:28
    vim打开多窗口、多文件之间的切换
  • 基本的SpringMVC的搭建在我的上一篇文章里已经写过了,这篇文章主要说明一下如何使用SpringMVC进行表单上的文件上传以及文件同时上传的步骤 SpringMVC 基础教程 框架分析:...
  • JQuery实现多文件上传

    万次阅读 热门讨论 2013-12-03 19:44:38
    实现了多文件上传. Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.   官方下载 官方文档   下面首先讲解 1如何实现上传多文件. 2 之后是解决如何实现大文件上传     首先
  • Element组件功能强大,扩展性也好,upload文件上传组件支持单文件上传,对于办公文件,头像等都有专门的解决方案,同时可以附加参数,并且也能进行多文件上传,但是这里的多文件上传是分多次请求发送到后台的,可能...
  • AWK实现多文件读取和处理

    万次阅读 2018-05-31 21:46:55
    当我们使用awk整合文件的时候,如果是两个文件,我们经常会用NR==FNR和NR!=FNR两个来指定读取第一个或者是第二个文件,...我们可以使用如下三种通用方式来实现awk多文件的读取和处理:第一种: awk 'ARGIND==1{......
  • 1.单文件 前端Jquery var url="..........";//上传地址 formData = new FormData(); //uploadFile就是后台接收的文件参数名称 formData.append('uploadFile', $('#file')[0].files[0]); jQuery.ajax({ ...
  • 菜鸟攻略——C语言多文件编程初探(一)

    万次阅读 多人点赞 2012-03-04 13:21:43
    发现有很多童鞋学了一年半载的C语言还不会多文件编程。很多人到现在一个程序都只有一个源文件(main.cpp或mian.c)。甚至连我的室友大飞哥(我们都大二下学期了)昨天也问我怎么做。其实C语言的多文件并不神秘。哥...
  • CodeBlocks中程序的多文件组织

    万次阅读 多人点赞 2013-11-10 21:55:08
    一个程序只有一个main函数的时候过去了,我们有了自定义函数。一个程序只用一个文件的时候也要过去了。当一个程序中的函数多起来时(main函数只能有一个,自然是具有...本文讲在CodeBlocks中如何进行程序的多文件组织。
  • element-ui中el-upload多文件一次性上传

    万次阅读 多人点赞 2019-06-14 10:23:29
    项目需求是文件上传,在一次请求中完成,而ElementUI的上传组件是每个文件发一次上传请求,因此我们借助FormData的格式向后台传文件组 html代码: <div class="upload-file"> <el-upload accept="....
  • linux 下vim的多文件操作

    万次阅读 2018-02-01 15:14:35
    vim下如何同时打开文件,而且文件间切换操作,在网上搜集一些材料,自己整理了一下,下面我们来看看这些操作: 一、打开文件: 1、vim还没启动时: #:vim file1 file2 file3…filen /或者使用/ //...
  • source insight 多文件并行显示

    万次阅读 2016-10-15 16:51:44
    source insight 默认安装的时候,没打开一个文件,另一个...安装后,重启source insight 后,打开文件效果如下: 。 工具下载地址; http://download.csdn.net/detail/u012989337/9654710 有人说,smart ID
  • 一、配置文件: SpringMVC 用的是 的MultipartFile来进行文件上传 所以我们首先要配置MultipartResolver:用于处理表单中的file --> --> 属性详解: defaultEncoding="UTF-8" 是请求的编码格式...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,285,061
精华内容 2,914,024
关键字:

多文件