在Spring mvc 中已经封装了common-fileupload,所以在Spring MVC 中实现文件上传是一件相对简单的事情。
- 在Spring 的配置文件中配置一个multiparResover Bean
- 在上传文件的表单中将属性enctype 设置问”multipart/form-data”
- 实现controller
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="100000000" />
<property name="defaultEncoding" value="utf-8" />
</bean>
写道
<form name="uploadForm" id="uploadForm" action="$tuitionModule.setTarget('upload.htm')" method="POST" enctype="multipart/form-data">
<div class="tb-table">
<table>
<tr>
<td width="20%"></td>
<td width="30%"><span class="btn"><input type="file" name="uploadFile" id="uploadFile" /></span></td>
<td><span class="btn"><input type="submit" value="导入数据" id="btn-primary"></span></td>
</tr>
</table>
</div>
</form>
<div class="tb-table">
<table>
<tr>
<td width="20%"></td>
<td width="30%"><span class="btn"><input type="file" name="uploadFile" id="uploadFile" /></span></td>
<td><span class="btn"><input type="submit" value="导入数据" id="btn-primary"></span></td>
</tr>
</table>
</div>
</form>
写道
public class FileUploadController {
private static final Logger logger = LoggerFactory
.getLogger(FileUploadController.class);
@Autowired
private MultipartFileValidator multipartFileValidator;
@Autowired
private TuitionPropertyParser tuitionPropertyParser;
@OsgiReference
private TuitionOrderServiceClient tuitionOrderServiceClient;
/**文件上传的默认根目录**/
private static final String default_parent_dir = "/home/admin/sharedata/upload/ipay/tuition/paybang/";
@RequestMapping(value = "/upload.htm", method = RequestMethod.GET)
public String showUploadPageI(Model model) {
return TuitionConstants.UPLOAD_PAGE;
}
@RequestMapping(value = "/upload.htm", method = RequestMethod.POST)
public String upload(@RequestParam("uploadFile") MultipartFile uploadFile,
HttpServletRequest request, Model model) {
// 如果文件不为空
if (multipartFileValidator.validate(uploadFile)) {
try {
String fileName = uploadFile.getOriginalFilename();
String dest = default_parent_dir
+ DateUtil.format(new Date(), DateUtil.shortFormat) + "/" + fileName;
// 判断文件是否存在,不允许上传重复文件
if (new File(dest).exists()) {
throw new AlipayRuntimeException("重复文件上传");
}
//将解析文件的结果返回
List<TuitionOrderModel> orders = tuitionPropertyParser.parser(uploadFile
.getInputStream(), dest, OperationContextHolder.getPrincipal().getUserId());
// 保存数据失败
if (!tuitionOrderServiceClient.saveOrders(orders)) {
model.addAttribute(TuitionConstants.KEY_ERROR_MSG, "数据落地异常");
logger.error("未能够成功保存数据");
return TuitionConstants.UPLOAD_PAGE;
}
model.addAttribute(TuitionConstants.KEY_ITEMS, orders);
model.addAttribute("fileName", dest);
// 复制文件
copyFile(uploadFile, dest);
} catch (Exception e) {
model
.addAttribute(TuitionConstants.KEY_ERROR_MSG,
"上传文件异常,文件名称是:" + uploadFile.getOriginalFilename() + "(" + e.getMessage()
+ ")");
logger.error("上传文件异常", e);
return TuitionConstants.UPLOAD_PAGE;
}
} else {
// 上传文件为空
model.addAttribute("errorMsg", "上传文件异常,文件为空或者文件格式不正确,目前支持的文件格式为:"
+ multipartFileValidator.getAllowedTypes());
}
return TuitionConstants.UPLOAD_PAGE;
}
/**
* 将上传的文件上传到指定的目录下
*
* @param uploadFile 上传的文件
* @param dest 目的地
* @throws IOException
*/
private void copyFile(MultipartFile uploadFile, String dest) throws IOException {
byte[] bytes = uploadFile.getBytes();
File filePath = new File(dest);
if (!filePath.getParentFile().exists()) {
filePath.getParentFile().mkdirs();
}
FileCopyUtils.copy(bytes, filePath);
}
}
private static final Logger logger = LoggerFactory
.getLogger(FileUploadController.class);
@Autowired
private MultipartFileValidator multipartFileValidator;
@Autowired
private TuitionPropertyParser tuitionPropertyParser;
@OsgiReference
private TuitionOrderServiceClient tuitionOrderServiceClient;
/**文件上传的默认根目录**/
private static final String default_parent_dir = "/home/admin/sharedata/upload/ipay/tuition/paybang/";
@RequestMapping(value = "/upload.htm", method = RequestMethod.GET)
public String showUploadPageI(Model model) {
return TuitionConstants.UPLOAD_PAGE;
}
@RequestMapping(value = "/upload.htm", method = RequestMethod.POST)
public String upload(@RequestParam("uploadFile") MultipartFile uploadFile,
HttpServletRequest request, Model model) {
// 如果文件不为空
if (multipartFileValidator.validate(uploadFile)) {
try {
String fileName = uploadFile.getOriginalFilename();
String dest = default_parent_dir
+ DateUtil.format(new Date(), DateUtil.shortFormat) + "/" + fileName;
// 判断文件是否存在,不允许上传重复文件
if (new File(dest).exists()) {
throw new AlipayRuntimeException("重复文件上传");
}
//将解析文件的结果返回
List<TuitionOrderModel> orders = tuitionPropertyParser.parser(uploadFile
.getInputStream(), dest, OperationContextHolder.getPrincipal().getUserId());
// 保存数据失败
if (!tuitionOrderServiceClient.saveOrders(orders)) {
model.addAttribute(TuitionConstants.KEY_ERROR_MSG, "数据落地异常");
logger.error("未能够成功保存数据");
return TuitionConstants.UPLOAD_PAGE;
}
model.addAttribute(TuitionConstants.KEY_ITEMS, orders);
model.addAttribute("fileName", dest);
// 复制文件
copyFile(uploadFile, dest);
} catch (Exception e) {
model
.addAttribute(TuitionConstants.KEY_ERROR_MSG,
"上传文件异常,文件名称是:" + uploadFile.getOriginalFilename() + "(" + e.getMessage()
+ ")");
logger.error("上传文件异常", e);
return TuitionConstants.UPLOAD_PAGE;
}
} else {
// 上传文件为空
model.addAttribute("errorMsg", "上传文件异常,文件为空或者文件格式不正确,目前支持的文件格式为:"
+ multipartFileValidator.getAllowedTypes());
}
return TuitionConstants.UPLOAD_PAGE;
}
/**
* 将上传的文件上传到指定的目录下
*
* @param uploadFile 上传的文件
* @param dest 目的地
* @throws IOException
*/
private void copyFile(MultipartFile uploadFile, String dest) throws IOException {
byte[] bytes = uploadFile.getBytes();
File filePath = new File(dest);
if (!filePath.getParentFile().exists()) {
filePath.getParentFile().mkdirs();
}
FileCopyUtils.copy(bytes, filePath);
}
}