Java 文件上传 MultipartFile

Java 文件上传 MultipartFileJava文件上传MultipartFile1. 配置MultipartResolver:用于处理表单中的file

大家好,又见面了,我是你们的朋友全栈君。

Java 文件上传 MultipartFile

1. 配置MultipartResolver:用于处理表单中的file

Java 文件上传 MultipartFile

<!-- 配置MultipartResolver 用于文件上传 使用spring的CommosMultipartResolver -->  
    <beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"  
        p:defaultEncoding="UTF-8"  
        p:maxUploadSize="5400000"  
        p:uploadTempDir="fileUpload/temp"  
     >  
    </beans:bean>  

defaultEncoding=”UTF-8″               是请求的编码格式,默认为iso-8859-1
maxUploadSize=”5400000″            是上传文件的大小,单位为字节
uploadTempDir=”fileUpload/temp”  为上传文件的临时路径

2.创建上传表单,
在form标签中加上enctype=”multipart/form-data”表示该表单是要处理文件的

<form  id="upt_form" name="upt_form" action="" method="post" enctype="multipart/form-data" οnsubmit="return checkformDelSpace(this)">
	<div class="row-form">
		<div class="span2">附件</div>
		<div class="span10">
			<div class="ajaxuploadfile_component_1">
				<div class="ajaxuploadfile_one">
					<div class="span12">
						<div class="input-append file">
							<input type="file" name="file"/>
							<input type="text" id="addFile" readonly="readonly"
									class="funcCall[checkFile]"/>
							<button class="btn" type="button">浏览</button>
						</div>
					</div>
				</div>
			</div>
		</div>
	</div>
</form>


3 js 控制验证上传文件格式 funcCall[checkFile]

//***********************************上传验证**********************************
	function checkFile(field, rules, i, options) {
		//上传文件验证
		var urlStr = field.val();
		if (null == urlStr || urlStr == "") {
			return;
		}
		if (urlStr != "") {
			var urlType = urlStr.substring(urlStr.lastIndexOf(".") + 1, urlStr.length);
			urlType = urlType.toLowerCase();
			if (urlType == "jpg" || urlType == "png" || urlType == "jpeg" || urlType == "gif" || urlType == "bmp") {
			}
			else {
				return options.allrules.validatePhoto.alertText;
			}
		}
	}


3.创建一个控制类:上传Controller


	/**
     * 修改需求Action
     *
     * @param request HttpServletRequest
     * @param form    form表单
     * @param file    文件
     * @return String
     */
    @RequestMapping("uptRequestInfoAction.do")
    @ResponseBody
    public Map<String,Object> uptRequestInfoAction(HttpServletRequest request, RequestQueryForm form,
                                                   @RequestParam(value="file", required=false) MultipartFile file) {
        Map<String,Object> map = new HashMap<String,Object>();
        User user = (User) SessionUtil.getSessionAttribute(request, "loginUser", User.class);
       
        try {
			// 判断文件是否为空
            if(!file.isEmpty()){
                String uploadFileName = file.getOriginalFilename();
                //上传文件
                String pattern = "";
                if (uploadFileName.contains(".")) {
                    pattern = uploadFileName.substring(uploadFileName.lastIndexOf("."));
                }
                String fileName = "*****" + "_" +
                        DateExtendUtil.formatDate2String(new Date(), "yyyyMMddHHmmssSSS") +
                        pattern;
                String tmpFilePath = servletPath + "/" + fileName;
                File tmpFile = new File(tmpFilePath);
                // 写入临时文件
                if (!tmpFile.getParentFile().exists()) {
                    tmpFile.getParentFile().mkdirs();
                }
				// 转存文件 
                file.transferTo(tmpFile);

                InsertReqDTO insertReqDTO = new InsertReqDTO();
                //文件名
                insertReqDTO.setFileName(fileName);
                //机构编码
                insertReqDTO.setOrgCode("baofoo");
                //文件组(参照枚举类FileGroup 不同文件组存放时效不同)
                insertReqDTO.setFileGroup(FileGroup.AUTHENTICATION);
                //文件日期
                insertReqDTO.setFileDate(DateUtil.getCurrent(DateUtil.fullPatterns));
                //备注信息
                insertReqDTO.setRemark("需求信息附件");
                //上传文件路径
                insertReqDTO.setFilePath(tmpFilePath);
                //文件名,机构编码,文件日期 不能重复
                log.info("call 需求信息附件 Param {}:", ToStringBuilder.reflectionToString(insertReqDTO,
                        ToStringStyle.SHORT_PREFIX_STYLE));
                CommandResDTO resDTO = DfsClient.upload(insertReqDTO);
                log.info("call 需求信息附件 result {}", ToStringBuilder.reflectionToString(resDTO,
                        ToStringStyle.SHORT_PREFIX_STYLE));
                // 附件地址
                form.setFile_url(FormatUtil.toString(resDTO.getFileId()));
                // 附件类型
                form.setFile_type(pattern.toLowerCase());
            }
            int uptTag = requestQueryService.uptRequestInfo(form);
            // 记录操作日志
            int r  = requestQueryService.addInsertEvent(form);
            if(r < 1 || uptTag < 1){
                map.put("retCode",0);
                map.put("retMsg","修改需求信息失败!");
                log.info("需求信息更新失败:【日志记录】call requestQueryService addInsertEvent:{}",r);
                log.info("需求信息更新失败:call requestQueryService uptRequestInfo:{}",uptTag);
            }else{
                map.put("retCode",1);
                map.put("retMsg","修改需求信息成功!");
            }
        } catch (Exception e) {
            log.error("call uptRequestInfoAction  修改异常 ******", e);
            map.put("retCode",0);
            map.put("retMsg","修改需求信息失败!"+e);
        }
        return map;
    } 

下载保存附件:

/**
     * 下载非图片的附件
     * @param request  HttpServletRequest
     * @param response HttpServletResponse
     */
    @RequestMapping("downloadFile.do")
    public void downloadFile(HttpServletRequest request, HttpServletResponse response) {
        InputStream in = null;
        OutputStream out = null;
        try {
            Long file_id = Long.valueOf(request.getParameter("file_id"));

            if (file_id == null || file_id == 0L) {
                throw new ServiceException("requestQueryManager downloadFile 传入的dfs文件id错误");
            }

            QueryReqDTO reqDTO = new QueryReqDTO();
            reqDTO.setFileId(file_id);
            reqDTO.setOperation(Operation.QUERY);
            log.info("downloadExcel QueryReqDTO:" + ToStringBuilder.reflectionToString(reqDTO));

            Response res = SocketUtil.sendMessage(reqDTO);
            if (!res.isSuccess()) {
                throw new DfsException(ErrorCode.GET_FILE_INFO_ERROR, res.getErrorMsg());
            }
            CommandResDTO resDTO = (CommandResDTO) res.getResult();

            String file_Name = resDTO.getFileName();

            DfsClient.download(reqDTO, downloadUrl);
            response.reset(); // 清空缓存区
            String fileName = new String(file_Name.getBytes("Gb2312"), "ISO-8859-1"); // 文件名称的编码
            response.setHeader("Content-Disposition", "attachment;fileName=" + fileName); // 设置文件头
            File file = new File(this.downloadUrl + "/" + file_Name);
            in = new FileInputStream(file);
            int len;
            byte[] buffer = new byte[1024];
            out = response.getOutputStream();
            while ((len = in.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
        } catch (Exception e) {
            if(e instanceof ServiceException){
                log.error("call requestQueryManager downloadFile Exception:{}", e.getMessage());
            }else {
                log.error("call requestQueryManager downloadFile Exception:{}", e);
            }
        } finally {
            IOUtils.closeQuietly(in);
            IOUtils.closeQuietly(out);
        }
    }


(1)
通过MultipartFile的transferTo(File dest)这个方法来转存文件到指定的路径

(2)采用MultipartFile上传文件是可以为空,可以多个文件上传

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


4. 多文件上传

(1) 上传表单

<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>

(2)上传Controller

/**** 
 *保存文件
 * @param file
 * @return
 */
	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;
	}
 编写action:
	@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";
	}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146552.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JavaScript定时器与清除定时器

    JavaScript定时器与清除定时器定时器 清除定时器

    2025年7月20日
    5
  • ftp常用命令详解_ospf生成路由表的过程

    ftp常用命令详解_ospf生成路由表的过程在window下按window+r可打开DOS命令窗口,然后就可以输入FTP命令了。1.登录FTP服务器方法一:直接输入ftp加ip地址ftp192.168.10.xxx方法二:直接输入ftp,进入ftp服务后输入open加ip地址open192.168.10.xxx当连接成功后会让你进行身份验证,在输入密码时屏幕上没有任何显示,不用管,直接…

    2022年9月21日
    1
  • SpringBootTest使用MockMvc测试Controller

    SpringBootTest使用MockMvc测试Controllerimportstaticorg.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;importstaticorg.springframework.test.web.servlet.result.MockMvcResultMatchers.*;@RunWith(SpringRunner.class)@…

    2022年5月5日
    47
  • js操作元素属性_如何将ajax返回的网页加载出来

    js操作元素属性_如何将ajax返回的网页加载出来session时使用sessionStorage.Storage表示存储的意思。一.设置值sessionStorage.setItem(key,value);设置元素的值,setItem.类似于服务器端的setAttribute();二.得到值vardata=sessionStorage.getItem(key);类似于服务器端的getAttribute…

    2022年10月10日
    5
  • Java学习路线总结(书籍、视频推荐篇)[通俗易懂]

    Java学习路线总结(书籍、视频推荐篇)[通俗易懂]立志存高远,笃行践初心三更灯火五更鸡,正是男儿读书时。黑发不知勤学早,白首方悔读书迟。立志,标定人生方向;奋斗,创造人生价值,二者相辅相成,互相促进。大部分程序员的「目标」都是成为一名优秀的工程师,一名可以统览全局的「架构师」。千里之行始于足下对于大部分普通人而言,成为一名优秀的架构师还是有一定难度的,「千里之行始于足下,一步一个脚印,慢慢来」。????粉丝专属福利:包邮送书3本,如下书单四选一。????获取方式:1、参与文末投票,点赞,收藏即有机会获得精美图书一

    2022年5月16日
    46
  • 协程(coroutine)简介

    协程(coroutine)简介Acoroutineisafunctionthatcansuspendexecutiontoberesumedlater.协程不是系统级线程,很多时候协程被称为“轻量级线程”

    2022年6月30日
    24

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号