• 本站压缩包统一解压密码:crowsong.xyz
  • 请善用右上角的搜索功能和下方的标签功能
  • 文章存在时效性,请注意发布时间与最后修改时间

SpringMVC使用MultipartFile文件上传,多文件上传,带参数上传

Java 水之笔记 5年前 (2018-08-03) 最后修改:4年前 (2019-05-07) 682次浏览 0个评论
  • 一、配置 SpringMVC
  • 二、单文件与多文件上传
  • 三、多文件上传
  • 四、带参数上传

一、配置 SpringMVC
在 spring.xml 中配置:

    <!-- springmvc 文件上传需要配置的节点-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="-1"/>
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="resolveLazily" value="false"/>
        <property name="uploadTempDir" value="/statics/document/tempdir"/>
        <!--<property name="maxInMemorySize" value="104857600"/>-->
    </bean>

其中属性详解:
defaultEncoding=”UTF-8″ 是请求的编码格式,默认为 iso-8859-1
maxUploadSize=”-1 是上传文件的大小,单位为字节 -1 表示无限制
uploadTempDir=”fileUpload/temp” 为上传文件的临时路径


二、单文件与多文件上传
1、单文件上传
jsp:

<body>  
<h2>文件上传实例</h2>  


<form action="fileUpload.html" method="post" enctype="multipart/form-data">  
    选择文件:<input type="file" name="file">  
    <input type="submit" value="提交">   
</form>  


</body>  

注意要在 form 标签中加上enctype=”multipart/form-data”表示该表单是要处理文件的!

controller:

    @RequestMapping("fileUpload")  
    public String fileUpload(@RequestParam(value = "file", required = false) MultipartFile file) {  
        // 判断文件是否为空  
        if (!file.isEmpty()) {  
            try {  
                // 文件保存路径  
                String filePath = request.getSession().getServletContext().getRealPath("/") + "upload/"  
                        + file.getOriginalFilename();  
                // 转存文件  
                file.transferTo(new File(filePath));  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
        // 重定向  
        return "redirect:/list.html";  
    }  

注意 RequestParam 参数中 value 的名字要与 jsp 中的相互匹配,否则会找不到返回空指针
transferTo 是存储文件的核心方法,但是这个方法同一个文件只能使用一次,不能使用第二次,否则 tomcat 服务器会报 500 的错误

MultipartFile 类常用的一些方法:

String getContentType()//获取文件 MIME 类型
InputStream getInputStream()//后去文件流
String getName() //获取表单中文件组件的名字
String getOriginalFilename() //获取上传文件的原名
long getSize() //获取文件的字节大小,单位 byte
boolean isEmpty() //是否为空
void transferTo(File dest)//保存到一个目标文件中。


三、多文件上传
与上面的相同只不过是 form 里面多创建几个 input
如果需要使用一个标签控件上传多个文件,需要使用 js 插件 uploadify
博主备份的下载地址(该版本为 flash 版本,不推荐,HTML5 版本请自行去官网下载)
uploadify.rar:点击下载,解压密码:crowsong.xyz
jsp:

<body>  
    <h2>上传多个文件 实例</h2>  


    <form action="filesUpload.html" method="post"  
        enctype="multipart/form-data">  
        <p>  
            选择文件:<input type="file" name="files">  
        <p>  
            选择文件:<input type="file" name="files">  
        <p>  
            选择文件:<input type="file" name="files">  
        <p>  
            <input type="submit" value="提交">  
    </form>  
</body>  

controller:

  private boolean saveFile(MultipartFile file) {  
        // 判断文件是否为空  
        if (!file.isEmpty()) {  
            try {  
                // 文件保存路径  
                String filePath = request.getSession().getServletContext().getRealPath("/") + "upload/"  
                        + file.getOriginalFilename();  
                // 转存文件  
                file.transferTo(new File(filePath));  
                return true;  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
        return false;  
    }  

    @RequestMapping("filesUpload")  
    public String filesUpload(@RequestParam("files") MultipartFile[] files) {  
        //判断 file 数组不能为空并且长度大于 0  
        if(files!=null&&files.length>0){  
            //循环获取 file 数组中得文件  
            for(int i = 0;i<files.length;i++){  
                MultipartFile file = files[i];  
                //保存文件  
                saveFile(file);  
            }  
        }  
        // 重定向  
        return "redirect:/list.html";  
    }  


四、带参数上传
还是使用 form 表单进行上传,但是上传文件的时候要带上一部分的参数
例子 form 上传使用多个 input 上传多个文件并且携带参数
jsp:
其中使用了 ajaxForm 插件,并没有展示出来

    <form method="post" enctype="multipart/form-data" id="uploadForm"
          action="${pageContext.request.contextPath}/background/worksInsert">
        作品名称:<input type="text" name="name" id="name"><br>
        参赛年份:<input type="text" name="year" id="year"><br>
        参加竞赛:<select name="competition" id="competition">
        <option value="请选择">请选择</option>
    </select><br>
        源文件上传:<input type="file" name="file1" id="file1"><br>
        展示文件上传:<input type="file" name="file2" id="file2"><br>
        附件上传:<input type="file" name="file3" id="file3"><br>
        <input type="submit" value="提交">

    </form>

controller:
主要是参数的书写,通过不同的 value 取到不同得文件,同时 request.getParameter 方法取到参数的值

  @RequestMapping("/worksInsert")
@ResponseBody
public MessageCarrier worksInsert(@RequestParam(value = "file1", required = false) MultipartFile file1, @RequestParam(value = "file2", required = false) MultipartFile file2, @RequestParam(value = "file3", required = false) MultipartFile file3, HttpServletRequest request) throws IOException {
MessageCarrier messageCarrier = new MessageCarrier();
if (file1 == null || request.getParameter("name") == null) {
return null;
}
// 获取源文件存储路径
String filename = request.getParameter("name");
String sworks = savePathL("works") + "/" + filename;
String vworks = savePathL("works") + "/" + filename;
String fworks = savePathL("works") + "/" + filename;
String sRealworks = System.getProperty("studentSystem.root") + sworks.substring(1, sworks.length());
String sRealvworks = System.getProperty("studentSystem.root") + vworks.substring(1, vworks.length());
String sRealfworks = System.getProperty("studentSystem.root") + fworks.substring(1, fworks.length());
DBWorks dbWorks = new DBWorks();
CompetitionWorks competitionWorks = new CompetitionWorks();
// System.out.println(request.getParameter("name"));
competitionWorks.setWorksName(request.getParameter("name"));
competitionWorks.setWorksYear(request.getParameter("year"));
competitionWorks.setWorksComID(request.getParameter("competition"));
competitionWorks.setWorksIsIndex("0");
competitionWorks.setWorksNeedUpdate("0");
competitionWorks.setWorksSavePath(sworks + "/" + file1.getOriginalFilename());
// 如果有展示文件获取展示文件的存储路径
if (file2 != null && file2.getSize() != 0) {
competitionWorks.setWorksSaveViewPath(vworks + "/" + file2.getOriginalFilename());
} else {
competitionWorks.setWorksSaveViewPath("NULL");
}
// 如果有附件的话获取附件的存储路径并保存
if (file3 != null && file3.getSize() != 0) {
competitionWorks.setWorksSaveFilePath(fworks + "/" + file3.getOriginalFilename());
} else {
competitionWorks.setWorksSaveFilePath("NULL");
}
//先将内容设置为 NULL
competitionWorks.setWorksContent("NULL");
messageCarrier = dbWorks.worksInsert(competitionWorks);
switch (messageCarrier.getMessageContent()) {
case "OK": {
FilesUpload filesUpload = new FilesUpload();
messageCarrier = filesUpload.upload(file1, sRealworks);
if (!competitionWorks.getWorksSaveViewPath().equals("NULL")) {
messageCarrier = filesUpload.upload(file2, sRealvworks);
}
if (!competitionWorks.getWorksSaveFilePath().equals("NULL")) {
messageCarrier = filesUpload.upload(file3, sRealfworks);
}
//如果上传成功则解析内容并将其录入数据库
if (messageCarrier.getMessageContent().equals("OK")) {
String path = competitionWorks.getWorksSavePath();
String filePath = System.getProperty("studentSystem.root") + path;
String fileName = path.substring(path.lastIndexOf("/") + 1);
File file = new File(filePath);
//解析文件内容
FilesToContent filesToContent = new FilesToContent();
String content = filesToContent.resolve(file);
// System.out.println(content);
competitionWorks.setWorksContent(content);
messageCarrier = dbWorks.worksUpdateName(competitionWorks);
}
}
break;
default: {
return messageCarrier;
}
}
return messageCarrier;
}


本文章笔记版本地址:http://ccdd6ec5.wiz03.com/share/s/3cTmX51TMQ-b2QTact03UPg83ItAml2XO4wJ23yjLa2bEKE1


水之笔记 , 版权所有丨如未注明 , 均为原创丨转载请注明出自 水之笔记的博客 crowsong.xyz
小站不易,若您觉得文章对您有所帮助,您可以在网页右上方使用支付宝赞助下小站或者扫描下支付宝红包。
喜欢 (0)
发表我的评论
取消评论

表情 加粗 删除线 居中 斜体

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址