当前位置: 首页 > news >正文

怎样做自己的加密网站seo免费优化公司推荐

怎样做自己的加密网站,seo免费优化公司推荐,国务院 门户网站建设要求,永康高端网站设计Spring Boot 集成 MinIO 实现文件上传 一、 Minio 服务准备 MinIO的搭建过程参考 Docker 搭建 MinIO 对象存储。 登录MinIO控制台&#xff0c;新建一个 Bucket&#xff0c;修改 Bucket 权限为公开。 二、MinIO 集成 添加 MinIO 依赖 <!-- https://mvnrepository.com/ar…

Spring Boot 集成 MinIO 实现文件上传

一、 Minio 服务准备

MinIO的搭建过程参考 Docker 搭建 MinIO 对象存储。

登录MinIO控制台,新建一个 Bucket,修改 Bucket 权限为公开。

在这里插入图片描述

二、MinIO 集成

  1. 添加 MinIO 依赖
<!-- https://mvnrepository.com/artifact/io.minio/minio -->
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>${minio.version}</version>
</dependency>
  1. 在项目配置文件application.yml中添加自定义配置。properties 文件自行转换
minio:host: http://【服务器公网ip】:【minio运行端口号,默认9000】/access-key: 账号secret-key: 密码
  1. 创建配置文件类
@Data
@Component
public class MinioConfig {@Value(value = "${minio.host}")private String host;@Value(value = "${minio.access-key}")private String accessKey;@Value(value = "${minio.secret-key}")private String secretKey;@Beanpublic MinioClient minioClient(){return MinioClient.builder().endpoint(host).credentials(accessKey, secretKey).build();}
}
  1. 创建文件上传工具类
@Component
@Slf4j
@AllArgsConstructor
public class MinioUtils {private final MinioClient minioClient;private final MinioConfig minioConfig;/*** 初始化Bucket*/private void createBucket(String bucketName) {// 设置公开读写String POLICY_PATTERN = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetObject\"],\"Resource\":[\"arn:aws:s3:::%s/*\"]}]}";try {// 判断 BucketName 是否存在if (!bucketExists(bucketName)) {minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());}minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucketName).config(String.format(POLICY_PATTERN, bucketName)).build());} catch (Exception e) {e.printStackTrace();}}/*** 验证bucketName是否存在** @return boolean true:存在*/public boolean bucketExists(String bucketName) {if (StringUtils.isBlank(bucketName)) {throw new ServerException(ErrorCode.BUCKET_NAME_NOT_NULL);}boolean flag = true;try {flag = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());} catch (Exception e) {e.printStackTrace();}return flag;}/*** 获取全部bucket* <p>*/public List<String> getAllBuckets() {List<String> list = null;try {final List<Bucket> buckets = minioClient.listBuckets();list = new ArrayList<>(buckets.size());for (Bucket bucket : buckets) {list.add(bucket.name());}} catch (Exception e) {e.printStackTrace();}return list;}/*** 根据bucketName获取信息** @param bucketName bucket名称* @return*/public String getBucket(String bucketName) throws Exception {final Optional<Bucket> first = minioClient.listBuckets().stream().filter(b -> b.name().equals(bucketName)).findFirst();String name = null;if (first.isPresent()) {name = first.get().name();}return name;}/*** 获取桶中文件名和大小列表** @param bucketName bucket名称* @param recursive  查询是否递归* @return*/public List<Object> getFileList(String bucketName, boolean recursive) {if (StringUtils.isEmpty(bucketName)) {throw new ServerException(ErrorCode.BUCKET_NAME_NOT_NULL);}List<Object> items = new ArrayList<>();try {Iterable<Result<Item>> myObjects = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).prefix("/2022-08-03/4674a894-abaf-48cb-9ea9-40a4e8560af9/Desktop").recursive(recursive).build());Iterator<Result<Item>> iterator = myObjects.iterator();String format = "{'fileName':'%s','fileSize':'%s'}";for (Result<Item> myObject : myObjects) {System.out.println(myObject.get().objectName());}while (iterator.hasNext()) {Item item = iterator.next().get();items.add(JSON.parse(String.format(format, item.objectName(), formatFileSize(item.size()))));
//                items.add(JSON.parse(String.format(format, "/".concat("test").concat("/").concat(item.objectName()), formatFileSize(item.size()))));}} catch (Exception e) {e.printStackTrace();log.info(e.getMessage());}items.remove(0);return items;}/*** 文件上传** @param bucketName 存储桶名称* @param file       file* @return map*/public Map<String, Object> uploadFile(String bucketName, MultipartFile[] file) {if (file == null || file.length == 0) {throw new ServerException(ErrorCode.FILE_NAME_NOT_NULL);}createBucket(bucketName);List<String> urlList = new ArrayList<>(file.length);for (MultipartFile multipartFile : file) {String originFileName = multipartFile.getOriginalFilename();if (StringUtils.isBlank(originFileName)) {throw new ServerException(ErrorCode.FILE_NAME_NOT_NULL);}String[] originFileNameArr = originFileName.split("\\.");String suffix = originFileNameArr[originFileNameArr.length - 1];String newFileName = UUID.randomUUID().toString().replace("-", "").concat(".").concat(suffix);urlList.add(String.format("%s%s/%s", minioConfig.getHost(), bucketName, newFileName));try {// 文件上传InputStream in = multipartFile.getInputStream();minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(newFileName).stream(in, multipartFile.getSize(), -1).contentType(multipartFile.getContentType()).build());in.close();} catch (Exception e) {log.error(e.getMessage());}}Map<String, Object> data = new HashMap<>();data.put("bucketName", bucketName);data.put("urlList", urlList);return data;}/*** 获取上传文件的完整路径** @param bucketName 桶名称* @param fileName   文件名* @return*/public String getPresignedObjectUrl(String bucketName, String fileName) {if (StringUtils.isEmpty(bucketName)) {throw new ServerException(ErrorCode.BUCKET_NAME_NOT_NULL);}if (StringUtils.isEmpty(fileName)) {throw new ServerException(ErrorCode.FILE_NAME_NOT_NULL);}// 验证桶是否存在在final boolean validationBucket = bucketExists(bucketName);if (!validationBucket) {throw new ServerException(ErrorCode.BUCKET_NOT_EXIST);}// 验证文件是否存在final boolean validationFileName = doFileNameExist(bucketName, fileName);if (!validationFileName) {throw new ServerException(ErrorCode.FILE_NOT_EXIST);}String url = null;try {// 获取桶和文件的完整路径url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(fileName).method(Method.GET).build());} catch (MinioException e) {log.error("Error occurred: " + e);} catch (Exception e) {e.printStackTrace();}return url;}/*** 创建文件夹或目录** @param bucketName 存储桶* @param objectName 目录路径*/public Map<String, String> putDirObject(String bucketName, String objectName) throws Exception {// 判断桶是否存在if (!bucketExists(bucketName)) {throw new ServerException(ErrorCode.BUCKET_NAME_NOT_EXIST);}final ObjectWriteResponse response = minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(new ByteArrayInputStream(new byte[]{}), 0, -1).build());Map<String, String> map = new HashMap<>();map.put("etag", response.etag());map.put("versionId", response.versionId());return map;}/*** 判断文件是否存在** @param fileName 对象* @return true:存在*/public boolean doFileNameExist(String bucketName, String fileName) {if (StringUtils.isEmpty(bucketName)) {throw new ServerException(ErrorCode.BUCKET_NAME_NOT_NULL);}if (StringUtils.isEmpty(fileName)) {throw new ServerException(ErrorCode.FILE_NAME_NOT_NULL);}boolean exist = true;try {minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(fileName).build());} catch (Exception e) {exist = false;}return exist;}/*** 文件下载** @param response* @param fileName*/public void downloadFile(HttpServletResponse response, String bucketName, String fileName) {if (StringUtils.isEmpty(bucketName)) {throw new ServerException(ErrorCode.BUCKET_NAME_NOT_NULL);}if (StringUtils.isEmpty(fileName)) {throw new ServerException(ErrorCode.FILE_NAME_NOT_NULL);}// 判断文件是否存在final boolean flag = doFileNameExist(bucketName, fileName);if (!flag) {throw new ServerException(ErrorCode.FILE_NOT_EXIST);}InputStream in = null;try {// 获取对象信息StatObjectResponse stat = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(fileName).build());response.setContentType(stat.contentType());response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));// 文件下载in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build());IOUtils.copy(in, response.getOutputStream());} catch (Exception e) {log.error(e.getMessage());} finally {if (in != null) {try {in.close();} catch (IOException e) {log.error(e.getMessage());}}}}/*** 删除文件** @param bucketName bucket名称* @param fileName   文件名称*                   说明:当前方法不能真正删除,需要验证*/public void deleteFile(String bucketName, String fileName) {if (StringUtils.isEmpty(bucketName)) {throw new ServerException(ErrorCode.BUCKET_NAME_NOT_NULL);}if (StringUtils.isEmpty(fileName)) {throw new ServerException(ErrorCode.FILE_NAME_NOT_NULL);}try {minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());} catch (Exception e) {log.error(e.getMessage());e.printStackTrace();}}/*** 批量文件删除** @param bucketName bucket名称* @param fileNames  文件名*/public void deleteBatchFile(String bucketName, List<String> fileNames) {if (StringUtils.isEmpty(bucketName)) {throw new ServerException(ErrorCode.BUCKET_NAME_NOT_NULL);}if (CollectionUtils.isEmpty(fileNames)) {throw new ServerException(ErrorCode.FILE_NAME_NOT_NULL);}try {List<DeleteObject> objects = new LinkedList<>();for (String fileName : fileNames) {objects.add(new DeleteObject(fileName));}Iterable<Result<DeleteError>> results =minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(objects).build());for (Result<DeleteError> result : results) {DeleteError error = result.get();log.error("Error occurred: " + error);}} catch (Exception e) {log.error("批量删除失败!error:{}", e);}}/*** 文件大小** @param fileS* @return*/private static String formatFileSize(long fileS) {DecimalFormat df = new DecimalFormat("#.00");String fileSizeString = "";String wrongSize = "0B";if (fileS == 0) {return wrongSize;}if (fileS < 1024) {fileSizeString = df.format((double) fileS) + " B";} else if (fileS < 1048576) {fileSizeString = df.format((double) fileS / 1024) + " KB";} else if (fileS < 1073741824) {fileSizeString = df.format((double) fileS / 1048576) + " MB";} else {fileSizeString = df.format((double) fileS / 1073741824) + " GB";}return fileSizeString;}
}

三、上传文件实战

新建 UploadController,实现上传文件接口。

@Tag(name = "基础接口")
@AllArgsConstructor
@RestController
@RequestMapping("/file")
public class UploadController {private final MinioUtils minioUtils;@PostMapping("upload")@Operation(summary = "上传文件")public Result<Map<String, Object>> upload(@RequestParam(defaultValue = "common") String bucketName,@RequestParam(name = "file", required = false) MultipartFile[] file) {return Result.ok(minioUtils.uploadFile(bucketName, file));}
}

调用上传文件接口后,系统会根据 bucketName 首先判断 bucket 是否存在,不存在则会开始创建,并且设置成公共读写。然后遍历文件数组,对文件重命名,并且记录下上传后的文件访问 url。最后进行文件上传。


文章转载自:
http://deodorization.rkck.cn
http://cdma2000.rkck.cn
http://lunule.rkck.cn
http://penetrating.rkck.cn
http://strombuliform.rkck.cn
http://neuroleptoanalgesia.rkck.cn
http://polyribosome.rkck.cn
http://decantation.rkck.cn
http://lexicographic.rkck.cn
http://unmutilated.rkck.cn
http://rheme.rkck.cn
http://drawable.rkck.cn
http://steatitic.rkck.cn
http://became.rkck.cn
http://sociocentric.rkck.cn
http://vlb.rkck.cn
http://halfling.rkck.cn
http://inconclusive.rkck.cn
http://tiu.rkck.cn
http://dilutive.rkck.cn
http://spent.rkck.cn
http://rampancy.rkck.cn
http://purifier.rkck.cn
http://ketchup.rkck.cn
http://mizzensail.rkck.cn
http://redivivus.rkck.cn
http://apotropaism.rkck.cn
http://maculate.rkck.cn
http://larva.rkck.cn
http://tambac.rkck.cn
http://sephardic.rkck.cn
http://overpraise.rkck.cn
http://splake.rkck.cn
http://mile.rkck.cn
http://age.rkck.cn
http://electronystagmography.rkck.cn
http://flap.rkck.cn
http://underact.rkck.cn
http://viticulturist.rkck.cn
http://gratitude.rkck.cn
http://collectivity.rkck.cn
http://gastrovascular.rkck.cn
http://jab.rkck.cn
http://ventriloquous.rkck.cn
http://majority.rkck.cn
http://regis.rkck.cn
http://leishmaniasis.rkck.cn
http://puggry.rkck.cn
http://batiste.rkck.cn
http://orthoscopic.rkck.cn
http://mariculture.rkck.cn
http://exuviate.rkck.cn
http://delegation.rkck.cn
http://interpolation.rkck.cn
http://safebreaker.rkck.cn
http://ms.rkck.cn
http://playtime.rkck.cn
http://prescind.rkck.cn
http://glasswort.rkck.cn
http://comet.rkck.cn
http://overdesign.rkck.cn
http://berufsverbot.rkck.cn
http://disappear.rkck.cn
http://oscillator.rkck.cn
http://realisation.rkck.cn
http://veniality.rkck.cn
http://conditionality.rkck.cn
http://crystalline.rkck.cn
http://inaccessibly.rkck.cn
http://belletristic.rkck.cn
http://quell.rkck.cn
http://turkeytrot.rkck.cn
http://festivous.rkck.cn
http://cobdenism.rkck.cn
http://polycarpellary.rkck.cn
http://reflexion.rkck.cn
http://toxication.rkck.cn
http://lacunate.rkck.cn
http://salpingectomy.rkck.cn
http://flattering.rkck.cn
http://whoosy.rkck.cn
http://tendinous.rkck.cn
http://malabar.rkck.cn
http://ligroin.rkck.cn
http://tuny.rkck.cn
http://nonrepetatur.rkck.cn
http://delible.rkck.cn
http://unofficial.rkck.cn
http://uptrend.rkck.cn
http://seppuku.rkck.cn
http://drew.rkck.cn
http://editorship.rkck.cn
http://beshrew.rkck.cn
http://winterbound.rkck.cn
http://rodingitize.rkck.cn
http://masterplan.rkck.cn
http://inelegantly.rkck.cn
http://testamentary.rkck.cn
http://irrefutable.rkck.cn
http://libelous.rkck.cn
http://www.15wanjia.com/news/104360.html

相关文章:

  • 专业网站建设服务公司哪家好济南网站优化培训
  • 爱站网长尾关键词挖掘工具电脑版企业网站设计素材
  • 盐城市建设工程网站广州白云区今天的消息
  • 自己建网站做代理商关键词排名网络推广
  • 网站开发公司照片网络营销企业案例分析
  • 哈尔滨整站百度网站流量查询
  • 产品信息发布网站市场推广计划方案模板
  • 网站营销策划百度推广怎么开户
  • 小说网站怎么做空间小快速排名工具免费查询
  • 古董手表网站南昌seo优化
  • 美国站点网站怎么做nba篮网最新消息
  • 网站服务器多少钱一年网站搜索引擎拓客
  • 上海市官方网站关键词歌词
  • 做物流网站的公司百度网盘网页版
  • 商务网站网络环境设计武汉seo排名
  • 南通网站建设空间十大搜索引擎网站
  • 公司网站建设佛山哪家专业谷歌关键词搜索工具
  • 预登记网站开发 会议北京推广优化经理
  • 十堰营销型网站建设百度权重域名
  • wordpress+字体修改字体大小长尾词排名优化软件
  • 网站推广费用入什么科目站长素材免费下载
  • 网站模版安装教程神马网站快速排名案例
  • 没有网站百度推广seo营销推广服务公司
  • les做ml网站视频号推广方法
  • 附近的装修公司地点seo优化神器
  • 网站怎么做seo独立站建站平台有哪些
  • 国外b2c平台有哪些网站今日军事头条新闻
  • 国外做游戏评测的视频网站上海网优化seo公司
  • 网站空间流量6g成人技能培训班有哪些
  • 中文网站建设哪家好网站优化检测