新版Minio的网络上传和下载(Java通过浏览器上传,下载)

之前的写过了基本的本地文件上传,这次讲一下如何在从网络中获取文件流再上传到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到浏览器中进行测试下载。

MinIO 是一个开源的对象存储服务器,常用于云原生应用中。要在 Java 中实现 MinIO上传下载功能,你可以使用官方提供的 MinIO SDK。以下是简单的步骤: 1. **添加依赖**: 首先,你需要通过 Maven 或 Gradle 添加 MinIO SDK 到你的项目中。对于 Maven,添加到 `pom.xml` 文件: ```xml <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>latest版本号</version> </dependency> ``` 更新`latest版本号`为实际的 MinIO SDK 版本。 2. **初始化连接**: 创建一个 `MinioClient` 实例,需要提供 endpoint (存储服务器地址) 和 access key (访问密钥): ```java Minio minioClient = new Minio("http://your-minio-endpoint.com", "ACCESS_KEY", "SECRET_KEY"); ``` 3. **上传文件**: 要上传文件,可以使用 `putObject()` 方法: ```java String bucketName = "your-bucket-name"; String objectName = "path/to/local/file.txt"; File file = new File(objectName); minioClient.putObject(bucketName, objectName, file); ``` 4. **下载文件**: 下载文件同样使用 `getObject()` 方法: ```java Response response = minioClient.getObject(new GetObjectRequest(bucketName, objectName)); InputStream inputStream = response.data(); // 将流保存到本地文件或其他目的地 File outputFile = new File("path/to/downloaded/file.txt"); Files.copy(inputStream, outputFile.toPath()); ``` 5. **错误处理**: 始终记得捕获异常并妥善处理网络错误、权限问题等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值