最近做了个多文件和多个字段属性同时上传的功能,共享一下自己的代码.
从前台传过来的请求数据不管怎样改变,后台取的数据的地方就是域对象中,
这段代码是使用的struts2作为表示层的,提供上传文件对应名,属性,getter,setter方法
private File[] files;//上传的文件,前台文件的name
private String[] filesFileName;//这是上传的文件名
private String[] filesContentType;//上传的文件类型,可以在tomcat的conf下的web.xml配置文件中找到
public List<RequirementFile> uploadFiles(RequirementManage entity, String busiType, String rmId) throws Exception{
// 上传文件
List<RequirementFile> listfile = new ArrayList<RequirementFile>();
for(int i = 0; i < files.length; i++){
File file = files[i];
String filenamestr = filesFileName[i];
// 拼接保存文件目录(表名作为子目录)
String path = null;
if (rmId != null && busiType != null) {
// 需要更新
path = System.getProperty("catalina.home") + "\\" + "files" +"\\"+
BusiTypeEnum.getTableNameByCode(busiType);
}else {
path = System.getProperty("catalina.home") + "\\" + "files" +"\\"+
BusiTypeEnum.getTableNameByCode(entity.getBusiType());
}
// 拼接新的文件名
//String filename = UuidKey.getInstance().genKey()+"_"+filenamestr;
String filename = System.currentTimeMillis()+"_"+filenamestr;
File f = new File(path);
// 若目录不存在,创建
if(!f.exists() && !f.isDirectory()){
f.mkdirs(); //f.mkdir();没有s只能创建单级目录
}
try {
// 创建输出流和输入流
FileInputStream is = new FileInputStream(file);
FileOutputStream os = new FileOutputStream(path+"\\"+filename);
//流对拷
IOUtils.copy(is, os);
// 上传文件的信息
RequirementFile requirementFile = new RequirementFile();//上传文件信息
requirementFile.setRfId(UuidKey.getInstance().genKey());
if (rmId != null && busiType != null) {
// 这是更新
requirementFile.setRmId(rmId);
}else {
requirementFile.setRmId(entity.getRmId());
}
String suffix = filenamestr.substring(filenamestr.lastIndexOf(".") + 1);
if (suffix.toUpperCase().endsWith("JPEG") || suffix.toUpperCase().endsWith("PNG")
|| suffix.toUpperCase().endsWith("BMP") || suffix.toUpperCase().endsWith("GIF")) {
requirementFile.setFileType("1");
}else if (suffix.toUpperCase().endsWith("DOC") || suffix.toUpperCase().endsWith("DOCX")) {
requirementFile.setFileType("2");
}else if (suffix.toUpperCase().endsWith("XLS") || suffix.toUpperCase().endsWith("XLSX")) {
requirementFile.setFileType("3");
}
requirementFile.setFilePath(path+"\\"+filename);
requirementFile.setFileName(filenamestr.substring(0, filenamestr.lastIndexOf(".")));
listfile.add(requirementFile);
// 关闭资源
is.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
requirementFileService.insertBatch(listfile);
return listfile;
}
这个比较通用的代码:从域对象中取
public String upload() throws Exception {
// 定义对象
String message = null;
RequirementManage entity = new RequirementManage();
List<RequirementFile> listfile = new ArrayList<RequirementFile>();
Map<String, String> map = new HashMap<String, String>();
Map<String, String> fileinfomap = new HashMap<String, String>();
// 1.获取请求域
HttpServletRequest request = getRequest();
// 2.拼接上传文件的保存目录,由根目录和不同业务需求的子目录组成
String rootPath = System.getProperty("catalina.home") + "/" + "files";
// 2.1获取业务类型拼接对应子目录(以表明作为子目录)
String busiType = request.getParameter("busiType");
String tableName = BusiTypeEnum.getTableNameByCode(busiType);
String path = rootPath +"/"+ tableName;
File file = new File(path);
// 2.2若目录不存在,创建
if(!file.exists() && !file.isDirectory()){
file.mkdir();
}
try {
// 3.创建文件处理工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 4.创建文件上传解析器,解析request域中数据
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");//设置编码,解决上传中文名乱码
// 5.解析数据
List<FileItem> list = upload.parseRequest(request);
for (FileItem item : list) {
if (item.isFormField()) {
//获取字段名字
String name = item.getFieldName();
//解决普通输入项中中文乱码问题
String value = item.getString("UTF-8");
map.put(name, value);
}else {
//获得上传的文件名称
String filename = item.getName();
if(filename == null || filename.trim().equals(" ")){
continue;
}
//去掉获取到文件名中的路径名,保留单纯的文件名
filename = UuidKey.getInstance().genKey() + "_" + filename.substring(filename.lastIndexOf("\\") + 1);
//获取item中的上传文件的输入流
InputStream in = item.getInputStream();
//创建一个文件输入流
String filePath = path + "/" + filename;
FileOutputStream out = new FileOutputStream(filePath);
//流对拷
IOUtils.copy(in, out);
// 添加上传文件的路径和文件名
fileinfomap.put(filePath, filename);
// 关闭资源
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
// 将普通字段需求信息保存
BeanUtils.populate(entity, map);
entity.setRmId(UuidKey.getInstance().genKey());
entity.setCreateUserId(LoginUserUtil.getUserId());
entity.setCreateUserName(LoginUserUtil.getUserName());
entity.setCreateTime(new Date());
entity.setModifyUserId(LoginUserUtil.getUserId());
entity.setModifyUserName(LoginUserUtil.getUserName());
entity.setModifyTime(new Date());
requirementManageService.insert(entity);
// 保存上传文件信息
if (!fileinfomap.isEmpty()) {
for(Map.Entry<String, String> entry : fileinfomap.entrySet()){
RequirementFile requirementFile = new RequirementFile();//上传文件信息
requirementFile.setRfId(UuidKey.getInstance().genKey());
requirementFile.setRmId(entity.getRmId());
String suffix = entry.getValue().substring("".lastIndexOf(".") + 1);
if (suffix.toUpperCase().endsWith("JPEG") || suffix.toUpperCase().endsWith("PNG")
|| suffix.toUpperCase().endsWith("BMP") || suffix.toUpperCase().endsWith("GIF")) {
requirementFile.setFileType("1");
}else if (suffix.toUpperCase().endsWith("DOC") || suffix.toUpperCase().endsWith("DOCX")) {
requirementFile.setFileType("2");
}else if (suffix.toUpperCase().endsWith("XLS") || suffix.toUpperCase().endsWith("XLSX")) {
requirementFile.setFileType("3");
}
requirementFile.setFilePath(entry.getKey());
requirementFile.setFileName(entry.getValue().substring(0, entry.getValue().lastIndexOf(".")));
listfile.add(requirementFile);
}
requirementFileService.insertBatch(listfile);
}
message = "success";//提示信息
} catch (Exception e) {
message = "上传失败!";
e.printStackTrace();
}
this.setResult(new BusinessResult(true, message));
return "success";
}
1557

被折叠的 条评论
为什么被折叠?



