美文网首页
spring mvc 文件上传

spring mvc 文件上传

作者: 天堂宝宝_V | 来源:发表于2017-06-20 20:35 被阅读333次

    本文介绍了通过导入架包的方式与使用maven依赖的方式分别使用springmvc框架实现单文件的上传主要逻辑流程,多文件上传留作后续更新。�

    一 、 导入架包实现Spring MVC 文件上传到服务器本地

    除了spring 架包外还需要org.apache.commons-fileupload-x.x.x.ja包的支持

    springmvc.xml 中配置bean

    <!-- 处理文件上传 -->
    <!-- id="multipartResolver" 属于spring文件装配时的一个属性,名称固定不能改变!!!! -->
      <bean id="multipartResolver"  
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >  
          <property name="defaultEncoding" value="utf-8"/> <!-- 默认编码 (ISO-8859-1)  --> 
          <property name="maxInMemorySize" value="10240"/> <!-- 最大内存大小 (10240) -->  
          <property name="uploadTempDir" value="/upload/"/> <!-- 上传后的目录名 (WebUtils#TEMP_DIR_CONTEXT_ATTRIBUTE)  --> 
          <property name="maxUploadSize" value="-1"/><!--  最大文件大小,-1为无限止(-1) -->  
      </bean>
    

    jsp 界面的处理 特别注意单词的拼写:enctype = "multipart/form-data"

    
    <form action="/RestMyibatisSpring/file/upload" method="post" enctype = "multipart/form-data">
       <!-- <input type = "hidden" name = "method" value ="upload"> -->
       <input type = "text" name = "fileName" >
       <input type = "file" name = "file" >
       <input type = "submit" value = "上传文件">
    </form>
    

    设置相应的controller处理

    import java.io.File;
    
    import javax.servlet.ServletContext;
    
    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.context.ServletContextAware;
    import org.springframework.web.multipart.commons.CommonsMultipartFile;
    
    @Controller
    @RequestMapping("/file")
    public class FileController_Rest implements ServletContextAware{
    private ServletContext servletContext;
       
       @Override
       public void setServletContext(ServletContext arg0) {
           this.servletContext = arg0;
       }
       
       @RequestMapping(value="/upload",method = RequestMethod.POST)
       public String uploadFile(String fileName,@RequestParam("file")CommonsMultipartFile file) {
           if (!file.isEmpty()) {
               String path = this.servletContext.getRealPath("/upload");
               String oriFileName = file.getOriginalFilename();
               
               String fileType = oriFileName.substring(oriFileName.lastIndexOf("."));
               String newFileName = fileName + fileType;
               File newFile = new File(path + "/" + newFileName);
               try {
                   file.getFileItem().write(newFile);
               } catch (Exception e) {
                   e.printStackTrace();
               }
           }
           return "/jsps/upload";
       }
    }
    

    二、 maven 使用spring 上传文件到hdfs系统

    spring使用文件上传功能处理springmvc的基础包之外还需要两个库
    commons-fileupload-1.2.2.jarcommons-io-2.0.1.jar的支持
    使用maven的直接导入commons-fileupload依赖就可以了,commons-fileupload会自动下载io依赖包

        <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.2</version>
        </dependency>
    

    ![enter description here][4]

    然后springmvc.xml中要配置spring的相关依赖

        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <property name="defaultEncoding" value="utf-8"/>
        </bean>
    

    jsp界面代码如下

    <form id="uploadFile" action="/cd/fileIndex/uploadFile" method="post"  enctype="multipart/form-data">
        <div class=":form-group">
            <label>选择文件</label>
            <input id="file" type="file" name="file" class="form-control"/>
            <input type="hidden" name="parentId" value="<%=rootDir.getFileIndexId()%>"/>
            <input type="hidden" name="parentPath" value="<%=rootDir.getPath()%>"/>
        </div>
    </form>
    

    Java代码如下

    controller

        @RequestMapping(value="/uploadFile",method=RequestMethod.POST)
        public String uploadFile(@RequestParam(value="file",required=false) MultipartFile file
                ,@SessionAttribute("loginUser") AppUser loginUser,String parentId,String parentPath) 
                        throws IllegalArgumentException, IOException, NoSuchAlgorithmException{
            //接受前台传输过来的文件并保存在hdfs上
            String fileName = file.getOriginalFilename();
            InputStream fStream = file.getInputStream();
            
            Long fileSize = file.getSize();
            
            String pathStr = "/user/root/clouddisk/" + fileName;
            String md5 = HDFSUtil.upLoadFileToHdfs(fStream, pathStr);
            
            return "redirect:/fileIndex/openDirectory?dirId=" + parentId;
        }
    

    HDFSUtil.java

    import java.io.IOException;
    import java.io.InputStream;
    import java.math.BigInteger;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.Arrays;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FSDataOutputStream;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    
    public class HDFSUtil {
        public static final Configuration CONFIGURATION = new Configuration();
    
        // 获取FileSystem 对象
        public static FileSystem getFileSystem() {
            try {
                return FileSystem.get(CONFIGURATION);
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    
        public static String upLoadFileToHdfs(InputStream iStream, String pathStr)
                throws IllegalArgumentException, IOException, NoSuchAlgorithmException {
    
            FileSystem fileSystem = HDFSUtil.getFileSystem();
    
            FSDataOutputStream outputStream = fileSystem.create(new Path(pathStr));
            
            byte[] buffer = new byte[1024];
            
    
            MessageDigest mDigest = MessageDigest.getInstance("MD5");
            int lenth = iStream.read(buffer,0,1024);
            while (lenth > -1) {
                //保证文件不失真
                if (lenth < 1024) {
                    byte[] lastBuffer = Arrays.copyOf(buffer, lenth);
                    mDigest.update(lastBuffer);
                    outputStream.write(lastBuffer);
                    
                } else {
                    mDigest.update(buffer);
                    outputStream.write(buffer);
                }
                lenth = iStream.read(buffer, 0, lenth);
                System.out.println("read" + lenth);
                
            }
            outputStream.hsync();
            outputStream.close();
            iStream.close();
            fileSystem.close();
            BigInteger bigInteger = new BigInteger(1, mDigest.digest());
            return bigInteger.toString(16);
            
        }
    }
    

    相关文章

      网友评论

          本文标题:spring mvc 文件上传

          本文链接:https://www.haomeiwen.com/subject/yujjqxtx.html