Java中关于文件上传的做法

首先要明确一个点,文件上传的本质实际上是在项目当中定义了一个文件夹(没有的话就自动创建),将上传的附件之类的东西放在里头,将文件名和文件的路径存到数据当中,最后再通过前端的显示实现 上传、查看、下载。

 

 

那我们要做的工作包括:

1、分开文件名,拆分为文件名和后缀

2、定义文件流,它经历了  MultipartFile->File->FileItem

3、创建存放附件的文件夹

4、文件流传文件,文件名和文件的路径存数据库

 

 

来看看这样一个功能的文件上传是怎么做到的

 

 

 

 

对于第一张表格,我们在创建它的数据的时候呢,给它赋予了传附件的功能,

 

这边的前端是这样写的。

注意,此时表格form  必须加上  enctype="multipart/form-data",

这个属性表示多种类型的数据的传输,不仅仅是 传统的二进制的文本,还有 复杂的文件传输。

<div class =" layui-inline">
	<label class="layui-form-label" id="public_Net_AttachTag">附件</label>
	<div class="layui-input-inline" style="width: 500px;"  id="public_Net_isAttach">
		<input type="file" name="file" id="file"/>
	</div>
</div>

 

 

然后后端获取它的id并分别存入文件和和存放文件名、文件路径

//可以留意传入的参数是mfile
@RequestMapping(value = "/create")
public @ResponseBody String create(@RequestParam(value = "file", required = false) CommonsMultipartFile mFile, YfNetInfo yfNetInfo,HttpServletRequest request) {
	HashMap<String, String> keyMap=new HashMap<String, String>();

	
	try {
        //这边的输入是补全一些数据库数据创建必须的信息,如创建人、创建时间之类的,可以忽略
		yfNetInfo.setId(UUIDUtil.getUUID());
		yfNetInfo.setCompany(controller.currentCompany());
		yfNetInfo.setCreateUser(controller.currentUser());
		yfNetInfo.setCreateDateTime(DateTools.getFullNowDateTime());

		Map<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put("strSn", yfNetInfo.getStrSn());
		
		//文件相关的东西的初始的设置
		String strFileName = "";
		String strFilePath = "";
		String contentUploadPath = "/static/NetInfoUpload";
		String appPath = request.getSession().getServletContext().getRealPath(contentUploadPath);
		String netInfoId = yfNetInfo.getId();
		//上传附件到相关的记录当中
		if (!mFile.isEmpty()) {
			try {
				if (!mFile.isEmpty()) {
					String fid = UUIDUtil.getUUID();
					FileItem fileItem = mFile.getFileItem();
					File uploadFileDirct = new File(appPath, userName);
					
					if (!uploadFileDirct.exists())
						uploadFileDirct.mkdirs();
					strFileName = fileItem.getName();
					String suffixName = strFileName.substring(strFileName.lastIndexOf(".") + 1);
					
					String fileName = strFileName.substring(0,strFileName.lastIndexOf(".")) + netInfoId.replace("-", "") + "." + suffixName;
					File uploadFile = new File(uploadFileDirct, fileName);
					strFilePath = contentUploadPath + "/" + userName + "/" + fileName;
					fileItem.write(uploadFile);
					
					YfNetInfoAttach yfNetInfoAttach = new YfNetInfoAttach();
					yfNetInfoAttach.setCompany(controller.currentCompany());
					yfNetInfoAttach.setId(fid);
					yfNetInfoAttach.setAffiName(strFileName);
					BigDecimal b = new BigDecimal((double) fileItem.getSize() / 1024);
					double fileSize = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
					
					
					yfNetInfoAttach.setAffiSize(fileSize);
					yfNetInfoAttach.setAffiType(suffixName);
					yfNetInfoAttach.setNetInfoId(netInfoId);
					yfNetInfoAttach.setAffiStuts("0");
					yfNetInfoAttach.setAffiPath(strFilePath);
					yfNetInfoAttach.setAffiAbs(yfNetInfo.getStrMemo());
					yfNetInfoAttach.setRespNo(controller.user.getStrAccount());
					yfNetInfoAttach.setCreateUser(user);
					yfNetInfoAttach.setCreateDateTime(DateTools.getFullNowDateTime());
					yfNetInfoAttachService.addAttach(yfNetInfoAttach);
					ajaxObject.setMessage(fid+","+strFileName+","+strFilePath);
					ajaxObject.setStatusCode(AjaxObject.STATUS_CODE_SUCCESS);
					
				}
			} catch (Exception e) {
				e.printStackTrace();
				ajaxObject.setStatusCode(500);
				ajaxObject.setStatusCode(AjaxObject.STATUS_CODE_FAILURE);
			}
		}
		if (yfNetInfoService.create(yfNetInfo) == 1) {
			ajaxObject.setMessage("添加成功");	
		} else {
			ajaxObject.setStatusCode(AjaxObject.STATUS_CODE_FAILURE);
			ajaxObject.setMessage("添加失败");
		}
	} catch (Exception e) {
		e.printStackTrace();
		ajaxObject.setStatusCode(AjaxObject.STATUS_CODE_FAILURE);
		ajaxObject.setMessage("程序出错,添加失败");
	}
	ajaxObject.setNavTabId(moduleListNavId);
	return ajaxObject.toString();
}

 

 

我们将上面的代码简化一下,就是

1、传入的文件是MultipartFile类型

@RequestParam(value = "file", required = false) CommonsMultipartFile mFile

 

2、一部分代码是将文件信息存放到数据库当中

它们是文件名、文件后缀名、文件类型、文件大小、文件id

//获取文件名和文件后缀名
strFileName = fileItem.getName();
String fileName = strFileName.substring(0,strFileName.lastIndexOf(".")) + netInfoId.replace("-", "") + "." + suffixName;
String fileName = strFileName.substring(0,strFileName.lastIndexOf(".")) + netInfoId.replace("-", "") + "." + suffixName;



//文件id是随机生成的
String fid = UUIDUtil.getUUID();


//获取文件的大小
BigDecimal b = new BigDecimal((double) fileItem.getSize() / 1024);
double fileSize = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();


//文件类型就使用后缀名来界定



//文件路径适当处理一下然后存数据库
String contentUploadPath = "/static/NetInfoUpload";
strFilePath = contentUploadPath + "/" + userName + "/" + fileName;

 

3、一部分代码是将文件写入文件流然后放到本地项目的文件夹上面

if (!mFile.isEmpty()) {

    //开始和结束都是fileItem,可以留意一下
    FileItem fileItem = mFile.getFileItem();

    //假如说上传到的文件目录不存在,就重新创建一个文件目录 , 后面的两个参数代表了具体的文件存放位 置
    File uploadFileDirct = new File(appPath, userName);


    //创建文件流
    File uploadFile = new File(uploadFileDirct, fileName);

    
    fileItem.write(uploadFile);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值