公司项目有个需求是直接从前端页面上传文件到HDFS中,前端是form表单定义了hadoop连接、HDFS存储路径、上传文件等信息,目标是在用户填写完信息以后,文件带表单一块提交到后台。
实现思路:前端提交时,将文件跟表单数据一块提交到后台,后台通过MultipartFile和实体对象接收数据,读取MultipartFile中的文件,获取InputStream流,然后建立hadoop连接,根据定义好的存储路径,创建FSDataOutputStream流,将InputStream写入完成。
前端代码
省略了一些不重要内容
<form class="form-horizontal m" id="form-job-add" enctype="multipart/form-data">
....
<input type="file" id="filePath" name="filePath"></span>
...
</form>
function submitHandler(index,layero) {
if ($.validate.form()) {
uploadFile(index);
}
}
function uploadFile(index){
var formData = new FormData();
if ($('#filePath')[0].files[0] == null) {
$.modal.alertWarning("请先选择文件路径");
return false;
}
formData.append('jobmc', $("#jobmc").val());
formData.append('fileName', $("#fileName").val());
formData.append('file', $('#filePath')[0].files[0]);
$.ajax({
url: prefix + "/addUttDataLocalFile",
type: 'post',
cache: false,
data: formData,
processData: false,
contentType: false,
dataType: "json",
success: function(result) {
if(result.code==0){
alert('传输完成');
parent.layer.close(index);
}
}
});
}
后台代码
public AjaxResult addUttDataSaveLocalFile(@RequestParam("file") MultipartFile file, TInfoUttdata tInfoUttdata)
{
Map<String,Object> result = new HashMap<String,Object>();
if (StringUtils.isNotBlank(file.getOriginalFilename()) || null==tInfoUttdata) {
result = tInfoUttdataService.executeUploadFile(file,tInfoUttdata);
return AjaxResult.success("传输完成", result);
}else {
return AjaxResult.error("传输出错", result);
}
}
public Map<String, Object> executeUploadFile(MultipartFile file,TInfoUttdata tInfoUttdata) {
FileSystem fs = null;
InputStream is = null;
FSDataOutputStream out = null;
Map<String, Object> map = new HashMap<String,Object>();
try {
if(!"".equals(tInfoUttdata.getHdfsid())) {
//获取hadoop信息
TInfoHadoop hadoop = infoHadoopService.selectTInfoHadoopById(tInfoUttdata.getHdfsid());
//创建连接
fs = infoHadoopService.createHadoopConnect(hadoop);
String hdfsPath = hadoop.getHdfspath()+tInfoUttdata.getHdfspath()+"/"+file.getOriginalFilename()
//在hdfs中创建文件,并写入
out = fs.create(new Path(hdfsPath));
is = file.getInputStream();
byte[] b = new byte[is.available()];
int read = 0;
while((read = is.read(b)) > 0){
out.write(b, 0, read);
}
//存放数据
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
try {
if(null!=fs) {
fs.close();
}
if (is != null) {
is.close();
}
if (out != null) {
out.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return map;
}
大功告成。