springboot的文件上传下载
说明:主要是为了实现CSV文件的上传,下载获取文件名属性字段实现数据库建表操作:
- POM文件:
<!--CSV的文件上传解析-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
- 提交表单:
<form role="form" class="form-horizontal" th:action="@{/upload}" method="post" enctype="multipart/form-data">
<label for="dataName"></label>
字段名:<input type="text" name="dataName" id="dataName" placeholder="字段名">
<label for="dataType"></label>
字段属性:<input type="text" name="dataType" id="dataType" placeholder="字段属性">
<label for="OrderBy"></label>
主键字段:<input type="text" name="OrderBy" id="OrderBy" placeholder="主键字段">
<label for="partition"></label>
分区字段:<input type="text" name="partition" id="partition" placeholder="分区字段">
<h4>请选择您要上传的文件...</h4>
<input type="file" id="file" name="file" ><br><br>
<input type="submit" id="btn" class="btn btn-block btn-info" value="提交">
</form>
<table class="table table-bordered table-hover">
<tr>
<td>ID</td>
<td>文件的原始名称</td>
<td>文件的新名称</td>
<td>文件尾缀</td>
<td>存储路径</td>
<td>文件大小</td>
<td>类型</td>
<td>下载次数</td>
<td>上传时间</td>
<td>操作</td>
</tr>
<tr th:each="file : ${files}">
<td><span th:text="${file.fid}"></span></td>
<td><span th:text="${file.filename}"></span></td>
<td><span th:text="${file.oldFileName}"></span></td>
<td><span th:text="${file.ext}"></span></td>
<td><span th:text="${file.filepath}"></span></td>
<td><span th:text="${file.size}"></span></td>
<td><span th:text="${file.type}"></span></td>
<td th:id="${file.fid}"><span th:text="${file.downCounts}"></span></td>
<td><span th:text="${file.uploadTime}"></span></td>
<td>
<a href="/download" th:href="@{/download/} + ${file.fid}">下载</a>
<a href="/delete" th:href="@{/delete/} + ${file.fid}">删除</a>
<a href="/preview" th:href="@{/preview/} + ${file.fid}">预览</a>
<a href="#" >追加文件</a>
</td>
</tr>
</table>
- 控制器:
下载:
@GetMapping("/download/{fid}")
public void download(@PathVariable("fid") Integer fid, HttpServletResponse response) throws Exception {
Opendatafile opendatafile = fileService.findFileByFid(fid);
opendatafile.setDownCounts(opendatafile.getDownCounts()+1);
fileService.updateFile(opendatafile);
/*获取临时文件路径*/
String realpath = opendatafile.getFilepath();
/*获取文件输入流*/
FileInputStream is = new FileInputStream(realpath);
/*获取相应输出流*/
ServletOutputStream os = response.getOutputStream();
/*以附件的形势进行下载*/
response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(opendatafile.getFilename(),"UTF-8"));
/*文件拷贝*/
IOUtils.copy(is,os);
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(os);
}
删除控制器
@GetMapping("/delete/{fid}")
public String delete(@PathVariable("fid") Integer fid){
/*根据fid查询文件信息*/
Opendatafile opendatafile = fileService.findFileByFid(fid);
String filepath = opendatafile.getFilepath();
File file = new File(filepath,opendatafile.getFilename());
if (file.exists())file.delete();//立即删除本地文件
fileService.deleteFileByFid(fid);//数据库删除
return "redirect:/UserDetail";
}
上传控制器:
@PostMapping("/upload")
public String upload(MultipartFile file,
@RequestParam("OrderBy") String OrderBy,
@RequestParam("dataName") String dataName,
@RequestParam("dataType")String dataType,
@RequestParam("partition") String partition,
HttpSession session,Model model) throws Exception {
Date date = new Date();
/*获取文件名称*/
String fileName = file.getOriginalFilename();
String newFilename = new SimpleDateFormat("yyyyMMddHHmmss").format(date)+"-"+fileName;
opendatafile.setFilename(new SimpleDateFormat("yyyyMMddHHmmss").format(date)+"-"+fileName);
opendatafile.setOldFileName(null);
/*获取文件名后缀*/
String ext ="."+ FilenameUtils.getExtension(fileName);
opendatafile.setExt(ext);
/*获取文件大小*/
Long size = file.getSize();
opendatafile.setSize(size);
/*文件类型*/
String type = file.getContentType();
opendatafile.setType(type);
opendatafile.setUploadTime(new Date());
/*处理相对路径,变为绝对路径*/
String realPath = ResourceUtils.getURL("classpath:").getPath()+"static/File";
String dateDirPath = realPath+"/"+new SimpleDateFormat("yyyy-MM-dd").format(new Date());
File dataDir = new File(dateDirPath);
if (!dataDir.exists())dataDir.mkdirs();
/*文件上传*/
opendatafile.setFilepath(dateDirPath+"/"+opendatafile.getFilename());
file.transferTo(new File(dataDir,newFilename));
User user = (User) session.getAttribute("user");
opendatafile.setUid(user.getUid());
fileService.insertFile(opendatafile);
/*在数据库中可查看上传的文件信息1.获取文件的filepath,获取文件的新文件名*/
String fileName1 = opendatafile.getFilename();
String filepath = opendatafile.getFilepath();
File file1 = new File(filepath);
CHConnectUtils.uploadDataType(dataName,dataType,fileName1,filepath,OrderBy,partition);
return "redirect:/UserDetail";
}
CHConnectUtils.uploadDataType(dataName,dataType,fileName1,filepath,OrderBy,partition);
用户在前端表单上传数据时,上传数据段字段名,字段类型,指定主键和分区字段,数据库引擎:使用的数据库是clickhouse;
CHConnectUtils.java
private static Connection connection = null;
public static void exeSql(String sql){
String address = "jdbc:clickhouse://192.168.157.128:8123/default";
Connection connection = null;
Statement statement = null;
ResultSet results = null;
try {
Class.forName("ru.yandex.clickhouse.ClickHouseDriver");
connection = DriverManager.getConnection(address);
statement = connection.createStatement();
long begin = System.currentTimeMillis();
results = statement.executeQuery(sql);
long end = System.currentTimeMillis();
System.out.println("执行("+sql+")耗时:"+(end-begin)+"ms");
ResultSetMetaData rsmd = results.getMetaData();
List<Map> list = new ArrayList();
while(results.next()){
Map map = new HashMap();
for(int i = 1;i<=rsmd.getColumnCount();i++){
map.put(rsmd.getColumnName(i),results.getString(rsmd.getColumnName(i)));
}
list.add(map);
}
for(Map map : list){
System.err.println(map);
}
} catch (Exception e) {
e.printStackTrace();
}finally {//关闭连接
try {
if(results!=null){
results.close();
}
if(statement!=null){
statement.close();
}
if(connection!=null){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/*上传文件,并在clickhouse中创建数据表*/
public static void uploadDataType(String dataName,String dataType,String fileName,String filepath,String OrderBy,String partition){
System.out.println(dataName);
System.out.println(dataType);
String datanames[] = dataName.split(",");
String dataTypes[] = dataType.split(",");
/*使用默认的数据库引擎,默认的megerTree引擎*/
CHConnectUtils.exeSql("use System;");
String sql = "create table IF NOT EXISTS aaa (";
if (datanames.length == dataTypes.length&&datanames!=null||dataTypes==null){
for (int i = 0;i<datanames.length-1;i++){
sql = sql+ datanames[i]+" "+dataTypes[i]+",";
}
sql = sql+datanames[datanames.length-1]+" "+dataTypes[datanames.length-1]+")engine=MergeTree("+filepath+") PARTITION BY "+partition+" ORDER BY "+OrderBy+";";
}
System.out.println(sql);
CHConnectUtils.exeSql(sql);
}
第一个博客,直接上代码了,请指教!