首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java 文件上传 MultipartFile

Java 文件上传 MultipartFile

作者头像
全栈程序员站长
发布2022-08-27 16:40:00
发布2022-08-27 16:40:00
4.7K0
举报

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

Java 文件上传 MultipartFile

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

代码语言:javascript
复制
<!-- 配置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”表示该表单是要处理文件的

代码语言:javascript
复制
<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]

代码语言:javascript
复制
//***********************************上传验证**********************************
	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

代码语言:javascript
复制
	/**
     * 修改需求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;
    } 

下载保存附件:

代码语言:javascript
复制
/**
     * 下载非图片的附件
     * @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) 上传表单

代码语言:javascript
复制
<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

代码语言:javascript
复制
/**** 
 *保存文件
 * @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.cn/146552.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档