之前的写过了基本的本地文件上传,这次讲一下如何在从网络中获取文件流再上传到minio中。
百度很多案例都是老版本的,新版Api已经更新,不适用。
前端传文件过来后端都是通过MultipartFile格式来接收。
上传到minio中
@PostMapping("/upload")
public AjaxResult uploadFile(MultipartFile file){
try{
// 上传的文件路径
return fileService.upload(file);
}catch (Exception e){
return AjaxResult.error(e.getMessage());
}
}
/**
* 文件上传至Minio
*/
@Override
public AjaxResult upload(MultipartFile file) {
InputStream inputStream = null;
//创建Minio的连接对象
MinioClient minioClient = MinioClient minioClient =
MinioClient.builder()
.endpoint("http://"+"127.0.0.1"+":"+ "9000")
.credentials("minioadmin","minioadmin")
.build();
//你的bucket名字
String bucketName = "cxlong";
try {
inputStream = file.getInputStream();
//判断文件存储的桶是否存在
boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (!found) {
//如果桶不存在则创建通
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
//操作文件
String fileName = file.getOriginalFilename();
//防止文件名字重复2000/10/10当做文件的存储文件夹 uuid当文件名字
String objectName = new SimpleDateFormat("yyyy/MM/dd/").format(new Date()) + UUID.randomUUID().toString().replaceAll("-", "")
+ fileName.substring(fileName.lastIndexOf("."));
//文件上传
//由于使用的是SpringBoot与之进行集成 上传的时候拿到的是MultipartFile 需要通过输入输出流的方式进行添加
PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)
.bucket(bucketName)
.contentType(file.getContentType())
.stream(file.getInputStream(),file.getSize(),-1).build();
minioClient.putObject(objectArgs);
//封装访问的url给前端
//前端需要文件名和文件的访问地址
AjaxResult ajax = AjaxResult.success();
ajax.put("fileName", "/"+bucketName+"/"+objectName);
//url需要进行截取
ajax.put("url", minioConfig.getEndpoint()+":"+ minioConfig.getPort()+"/"+ minioConfig.getBucketName()+"/"+fileName);
return ajax;
}catch(Exception e){
e.printStackTrace();
return AjaxResult.error("上传失败");
}finally {
//防止内存泄漏
if (inputStream != null) {
try {
inputStream.close(); // 关闭流
} catch (IOException e) {
log.debug("inputStream close IOException:" + e.getMessage());
}
}
}
}
下面是上传之后预览的文件地址
下载
window.location.href = localhost+'/common/download?fileName=' + encodeURI('文件名.xlsx') + '&delete=' + false
@GetMapping("common/download")
public AjaxResult fileDownload(String fileName, HttpServletResponse response, HttpServletRequest request){
try{
if (!FileUtils.checkAllowDownload(fileName)){
throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));
}
return fileService.downloadByMinio(fileName,response);
}catch (Exception e){
log.error("下载文件失败", e);
return AjaxResult.error(e.getMessage());
}
}
/**
*
* @param fileName =文件名.xlsx
* @param response 文件名.xlsx
* @return
*/
@Override
@SneakyThrows
public AjaxResult downloadByMinio(String fileName,HttpServletResponse response) {
try {
MinioClient minioClient =
MinioClient.builder()
.endpoint("http://"+"127.0.0.1"+":"+ "9000")
.credentials("minioadmin","minioadmin")
.build();
//你的bocket名字
String bucketName = "cxlong";
//判断文件存储的桶是否存在
boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
//获取下载路径
String url = null;
if (found) {
url = minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(bucketName)
.object(fileName)
.expiry(2, TimeUnit.HOURS)
.build());
}
//miniUtil.downloadFile(bucketName, fileName, "clues.xlsx", response);
//获取文件数据对象
StatObjectResponse statObjectResponse =
minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(fileName).build());
// //以流的形式获取一个文件对象
InputStream stream = null;
if (statObjectResponse != null && statObjectResponse.size() > 0) {
stream = minioClient.getObject(
GetObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.build());
}
String filename = new String(fileName.getBytes("ISO8859-1"), StandardCharsets.UTF_8);
if (StringUtils.isNotEmpty("clues.xlsx")) {
fileName = "clues.xlsx";
}
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
ServletOutputStream servletOutputStream = response.getOutputStream();
int len;
byte[] buffer = new byte[1024];
while ((len = stream.read(buffer)) > 0) {
servletOutputStream.write(buffer, 0, len);
}
servletOutputStream.flush();
stream.close();
servletOutputStream.close();
AjaxResult ajax = AjaxResult.success();
ajax.put("fileName", fileName);
ajax.put("url", url);
return ajax;
}catch (Exception e) {
return AjaxResult.error(e.getMessage());
}
}
通过文件流传给前端浏览器进行下载,你也可以直接复制url到浏览器中进行测试下载。