zoukankan      html  css  js  c++  java
  • Spring 文件上传功能

    本篇文章,我们要来做一个Spring的文件上传功能:

    1. 创建一个Maven的web工程,然后配置pom.xml文件,增加依赖:

          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
              <version>1.0.2.RELEASE</version>
          </dependency>
    

    2.在webapp目录下的index.jsp文件中输入一个表单:

    <html>
    <body>
    <form method="POST" enctype="multipart/form-data"
          action="/upload">
        File to upload: <input type="file" name="file"><br /> Name: <input
            type="text" name="name"><br /> <br /> <input type="submit"
                                                         value="Upload"> Press here to upload the file!
    </form>
    </body>
    </html>
    

    这个表单就是我们模拟的上传页面。

    3. 编写处理这个表单的Controller:

    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.multipart.MultipartFile;
    
    @Controller
    public class FileUploadController {
    
        @RequestMapping(value="/upload", method=RequestMethod.GET)
        public @ResponseBody String provideUploadInfo() {
            return "You can upload a file by posting to this same URL.";
        }
    
        @RequestMapping(value="/upload", method=RequestMethod.POST)
        public @ResponseBody String handleFileUpload(@RequestParam("name") String name,
                @RequestParam("file") MultipartFile file){
            if (!file.isEmpty()) {
                try {
                    byte[] bytes = file.getBytes();
                    BufferedOutputStream stream =
                            new BufferedOutputStream(new FileOutputStream(new File(name + "-uploaded")));
                    stream.write(bytes);
                    stream.close();
                    return "You successfully uploaded " + name + " into " + name + "-uploaded !";
                } catch (Exception e) {
                    return "You failed to upload " + name + " => " + e.getMessage();
                }
            } else {
                return "You failed to upload " + name + " because the file was empty.";
            }
        }
    
    }
    

    4. 然后我们对上传的文件做一些限制,同时编写main方法来启动这个web :

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.context.embedded.MultiPartConfigFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    import javax.servlet.MultipartConfigElement;
    
    @Configuration
    @ComponentScan
    @EnableAutoConfiguration
    public class Application {
    
        @Bean
        public MultipartConfigElement multipartConfigElement() {
            MultiPartConfigFactory factory = new MultiPartConfigFactory();
            factory.setMaxFileSize("128KB");
            factory.setMaxRequestSize("128KB");
            return factory.createMultipartConfig();
        }
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

      5. 然后访问http://localhost:8080/upload就可以看到页面了。

    上面的例子是实现的是单个文件上传的功能,假定我们现在要实现文件批量上传的功能的话,我们只需要简单的修改一下上面的代码就行,考虑到篇幅的问题,下面只是贴出和上面不同的代码,没有贴出的说明和上面一样。:

    1.  新增batchUpload.jsp文件

    <html>
    <body>
    <form method="POST" enctype="multipart/form-data"
          action="/batch/upload">
        File to upload: <input type="file" name="file"><br />
        File to upload: <input type="file" name="file"><br />
        <input type="submit" value="Upload"> Press here to upload the file!
    </form>
    </body>
    </html>
    

    2. 新增BatchFileUploadController.java文件:

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.web.multipart.MultipartHttpServletRequest;
    
    import javax.servlet.http.HttpServletRequest;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.util.List;
    
    /**
     * Created by wenchao.ren on 2014/4/26.
     */
    
    @Controller
    public class BatchFileUploadController {
    
        @RequestMapping(value="/batch/upload", method= RequestMethod.POST)
        public @ResponseBody
        String handleFileUpload(HttpServletRequest request){
            List<MultipartFile> files = ((MultipartHttpServletRequest)request).getFiles("file");
            for (int i =0; i< files.size(); ++i) {
                MultipartFile file = files.get(i);
                String name = file.getName();
                if (!file.isEmpty()) {
                    try {
                        byte[] bytes = file.getBytes();
                        BufferedOutputStream stream =
                                new BufferedOutputStream(new FileOutputStream(new File(name + i)));
                        stream.write(bytes);
                        stream.close();
                    } catch (Exception e) {
                        return "You failed to upload " + name + " => " + e.getMessage();
                    }
                } else {
                    return "You failed to upload " + name + " because the file was empty.";
                }
            }
            return "upload successful";
        }
    }
    

      这样一个简单的批量上传文件的功能就ok了,是不是很简单啊。

    注意:上面的代码只是为了演示而已,所以编码风格上采取了随性的方式,不建议大家模仿。

    参考资料:

    1. MultipartResolver也可以实现文件上传功能。参考文章:http://mylfd.iteye.com/blog/1893648

  • 相关阅读:
    appium 多线程还是多进程(转)
    清理不可用的模拟器
    ios-元素查看器安装
    Linux 一条命令杀死占用端口的所有进程
    appium 小程序自动化测试
    (转)MitmProxy+APPnium安装使用
    mysql死锁分析
    母线故障跳闸的处理方法(转载)
    电动葫芦使用注意事项(转载)
    三菱plc输出指示灯不亮怎么办(转载)
  • 原文地址:https://www.cnblogs.com/rollenholt/p/3693087.html
Copyright © 2011-2022 走看看