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

网站空间800m成华区建设局质检站网站

网站空间800m,成华区建设局质检站网站,谭海波博客简介 wordpress,php做简单网站例子我们传统使用MinIo做OSS对象存储的应用方式往往都是在后端配置与MinIO的连接和文件上传下载的相关接口,然后我们在前端调用这些接口完成文件的上传下载机制,但是,当并发量过大,频繁访问会对后端的并发往往会对服务器造成极大的压力…

我们传统使用MinIo做OSS对象存储的应用方式往往都是在后端配置与MinIO的连接和文件上传下载的相关接口,然后我们在前端调用这些接口完成文件的上传下载机制,但是,当并发量过大,频繁访问会对后端的并发往往会对服务器造成极大的压力,大文件传输场景下,服务器被迫承担数据中转的角色,既消耗大量带宽资源,又形成单点性能瓶颈。这时,我们引入了MinIO的一种预签名机制。

预签名机制:在后端对文件的上传和下载操作生成一个URL,前端针对不同的文件操作形式请求会获取到对应的URL,这个URL可以理解为一个临时的通行证,有了这个URL后,前端可以直接向MinIO的服务端发上传和下载的相应请求,与MinIO直连操作,大大减缓了对后端服务器的压力

1.后端配置

1.1 引入Maven依赖并配置MinIO

<!--minio-->
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId>
</dependency>
/** MinIO配置类* @Author GuihaoLv*/
@Configuration
@EnableConfigurationProperties(MinIoProperties.class)
public class MinIoConfiguration {@Autowiredprivate MinIoProperties properties;@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint(properties.getEndpoint()).credentials(properties.getAccessKey(), properties.getSecretKey()).build();}}

1.2 生成预签名接口封装:

/**要改成使用预签名URL,让前端直接与MinIO交互,减轻服务器负担。* 生成上传预签名URL(PUT)* @param fileName* @return*/
@GetMapping("/presigned-upload-url")
@ApiOperation("获取上传预签名URL")
public Result<String> generateUploadUrl(@RequestParam("fileName") String fileName) {System.out.println("测试"+fileName);String url = commonFileService.generatePresignedUploadUrl(fileName);System.out.println("结构"+url);return Result.success(url);
}/**要改成使用预签名URL,让前端直接与MinIO交互,减轻服务器负担。* 生成下载预签名URL(GET)* @param fileName* @return*/
@GetMapping("/presigned-download-url")
@ApiOperation("获取下载预签名URL")
public Result<String> generateDownloadUrl(@RequestParam("fileName") String fileName) {String url = commonFileService.generatePresignedDownloadUrl(fileName);return Result.success(url);
}
/**生成上传预签名URL(PUT)* @param fileName* @return*/
public String generatePresignedUploadUrl(String fileName) {try {// 安全处理文件名(防止路径遍历)String safeFileName = sanitizeFileName(fileName);// 生成预签名URL(PUT方法)return client.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.PUT).bucket(properties.getBucketName()).object(safeFileName).expiry(15, TimeUnit.MINUTES) // 15分钟有效.build());} catch (Exception e) {throw new RuntimeException("生成预签名URL失败", e);}
}/*** 生成下载预签名URL(GET)* @param fileName* @return*/
public String generatePresignedDownloadUrl(String fileName) {try {String safeFileName = sanitizeFileName(fileName);return client.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(properties.getBucketName()).object(safeFileName).expiry(1, TimeUnit.HOURS) // 1小时有效.build());} catch (Exception e) {throw new RuntimeException("生成预签名URL失败", e);}
}// 文件名安全处理
private String sanitizeFileName(String fileName) {// 过滤非法字符,防止路径遍历return fileName.replaceAll("[^a-zA-Z0-9-_.]", "");
}

1.3 前端封装获取预签名和直连MinIO做上传下载的请求

// 获取上传预签名URL
export const getPresignedUploadUrl = (fileName) => {return httpInstance({url: '/web/commonFile/presigned-upload-url',method: 'GET',params: { fileName },});
};// 获取下载预签名URL
export const getPresignedDownloadUrl = (fileName) => {return httpInstance({url: '/web/commonFile/presigned-download-url',method: 'GET',params: { fileName },});
};// 单个文件直传MinIO,上传文件
export const uploadViaPresignedUrl = async (file: File) => {try {// 步骤1: 获取未编码的原始文件名(需与后端生成的签名匹配)const rawFileName = file.name;// 步骤2: 调用后端接口获取预签名URL(必须传递原始文件名)const res=await getPresignedUploadUrl(rawFileName);const presignedUrl=res.data;// 调试输出:验证URL格式console.log('[DEBUG] 预签名URL:', presignedUrl); // 应输出类似 http://47.99.49.193:9000/...// 步骤3: 直接向MinIO发送PUT请求(绕过代理)const response = await axios.put(presignedUrl, file, {// 关键配置:禁用代理和默认请求头baseURL: '', // [!code ++] 清除默认baseURLheaders: {'Content-Type': 'application/octet-stream' // MinIO通用类型}});return response.data;} catch (error) {throw new Error(`上传失败: ${(error).response?.data || error.message}`);}
};// 使用预签名URL直连MinIO下载文件
export const downloadViaPresignedUrl = async (fileName) => {try {// 1. 获取预签名URL:调用后端接口生成临时有效的下载URLconst { data: { data: presignedUrl } } = await getPresignedDownloadUrl(fileName);// 2. 创建隐藏链接触发下载const link = document.createElement('a');link.href = presignedUrl;       // 设置URLlink.download = fileName;       // 设置下载文件名,需与 MinIO 存储的文件名一致。document.body.appendChild(link); // 将链接添加到DOMlink.click();                    // 模拟点击触发下载document.body.removeChild(link); // 移除临时链接return true;                     // 表示下载已触发} catch (error) {throw new Error('下载失败: ' + error.message); // 统一错误处理}
};

1.4:写一个前端页面测试前端直连MinIO的功能实现

<script setup lang="ts">
import { ref } from 'vue';
import {uploadViaPresignedUrl,downloadViaPresignedUrl
} from '@/api/file';// 定义响应式变量
const selectedFile = ref<File | null>(null); // 存储用户选择的文件
const downloadFileName = ref<string>('');    // 下载时输入的文件名
const uploadStatus = ref<string>('');        // 上传状态提示
const downloadStatus = ref<string>('');      // 下载状态提示// 处理文件选择事件
const handleFileChange = (event: Event) => {const target = event.target as HTMLInputElement;if (target.files && target.files.length > 0) {selectedFile.value = target.files[0];uploadStatus.value = ''; // 重置上传状态}
};// 上传文件到MinIO
const uploadFile = async () => {uploadStatus.value = '上传中...';await uploadViaPresignedUrl(selectedFile.value);uploadStatus.value = '上传成功!';selectedFile.value = null; // 清空文件选择
}// 下载文件从MinIO
const downloadFile = async () => {downloadStatus.value = '正在触发下载...';const success = await downloadViaPresignedUrl(downloadFileName.value);if (success) {downloadStatus.value = '下载已触发!';}};
</script><template><div class="container"><!-- 上传文件部分 --><h2>测试MinIO文件上传</h2><input type="file" @change="handleFileChange" /><button @click="uploadFile" :disabled="!selectedFile">上传</button><p>{{ uploadStatus }}</p><!-- 下载文件部分 --><h2>测试MinIO文件下载</h2><inputv-model="downloadFileName"type="text"placeholder="请输入文件名(如 test.jpg)"/><button @click="downloadFile">下载</button><p>{{ downloadStatus }}</p></div>
</template>

上传测试结果:
 

下载测试:

http://www.dtcms.com/wzjs/563423.html

相关文章:

  • 网站风格包括什么意思科技布沙发好还是布艺沙发好
  • 怎样制作表白网站wordpress 首页轮播
  • 站长是什么级别沈阳企业网站建设
  • 需要网站建设想要自己做一个网站怎么做
  • 网站做淘宝客贵阳网站备案在哪里
  • 网站查询信息网站建设网站栏目结构图
  • 傻瓜式建个人网站春节期间西安有什么好玩的
  • 域名买了之后如何建设网站深圳十大教育培训机构排名
  • 网站后台管理需求免费建立平台网站
  • 如何看网站是否有做网站地图图书馆网站建设的项目报告
  • 贵港做网站建设价格费用国家食品查询网入口
  • 网站右键禁止企业管理系统的构成
  • 北京天通苑网站建设wordpress 自定义404
  • 海南省城乡建设厅网站做网站用图片算侵犯著作权吗
  • 建设租车网站网页优化建议
  • 网站建设预算及准备有没有专门做商铺招商的网站
  • 免费微网站建站系统如何修改网站发布时间
  • 南昌企业建设网站设计门户网站建设背景
  • 打开网站总显示建设中做ppt一般在什么网站好
  • 访问网站需要账号密码网站抓取超时错误
  • 做网站要搭建什么平台中企动力建站怎么样
  • 淘宝客优惠券网站怎么做的成都建设网站分享
  • 中交路桥建设网站wordpress单页网站在本页跳转
  • 企业小型网站要多少钱野望王维
  • 青岛网站建设全包wordpress 百科模板
  • 945新开传奇网站产品开发流程8个步骤案例
  • 网站建设免费维护内容自适应导航网站模板
  • wordpress entrance 1.2上海搜索引擎优化公司排名
  • 网站导航是什么意思站长工具使用
  • 建站源码程序商场网站开发的项目分析