tencent cloud

Cloud Object Storage

동향 및 공지
릴리스 노트
제품 공지
제품 소개
제품 개요
기능 개요
적용 시나리오
제품 장점
기본 개념
리전 및 액세스 도메인
규격 및 제한
제품 요금
과금 개요
과금 방식
과금 항목
프리 티어
과금 예시
청구서 보기 및 다운로드
연체 안내
FAQ
빠른 시작
콘솔 시작하기
COSBrowser 시작하기
사용자 가이드
요청 생성
버킷
객체
데이터 관리
일괄 프로세스
글로벌 가속
모니터링 및 알람
운영 센터
데이터 처리
스마트 툴 박스 사용 가이드
데이터 워크플로
애플리케이션 통합
툴 가이드
툴 개요
환경 설치 및 설정
COSBrowser 툴
COSCLI 툴
COSCMD 툴
COS Migration 툴
FTP Server 툴
Hadoop 툴
COSDistCp 툴
HDFS TO COS 툴
온라인 도구 (Onrain Dogu)
자가 진단 도구
실습 튜토리얼
개요
액세스 제어 및 권한 관리
성능 최적화
AWS S3 SDK를 사용하여 COS에 액세스하기
데이터 재해 복구 백업
도메인 관리 사례
이미지 처리 사례
COS 오디오/비디오 플레이어 사례
데이터 다이렉트 업로드
데이터 보안
데이터 검증
빅 데이터 사례
COS 비용 최적화 솔루션
3rd party 애플리케이션에서 COS 사용
마이그레이션 가이드
로컬 데이터 COS로 마이그레이션
타사 클라우드 스토리지 데이터를 COS로 마이그레이션
URL이 소스 주소인 데이터를 COS로 마이그레이션
COS 간 데이터 마이그레이션
Hadoop 파일 시스템과 COS 간 데이터 마이그레이션
데이터 레이크 스토리지
클라우드 네이티브 데이터 레이크
메타데이터 가속
데이터 레이크 가속기 GooseFS
데이터 처리
데이터 처리 개요
이미지 처리
미디어 처리
콘텐츠 조정
파일 처리
문서 미리보기
장애 처리
RequestId 가져오기
공용 네트워크로 COS에 파일 업로드 시 속도가 느린 문제
COS 액세스 시 403 에러 코드 반환
리소스 액세스 오류
POST Object 자주 발생하는 오류
보안 및 컴플라이언스
데이터 재해 복구
데이터 보안
액세스 관리
자주 묻는 질문
인기 질문
일반 문제
과금
도메인 규정 준수 문제
버킷 설정 문제
도메인 및 CDN 문제
파일 작업 문제
로그 모니터링 문제
권한 관리
데이터 처리 문제
데이터 보안 문제
사전 서명 URL 관련 문제
SDK FAQ
툴 관련 문제
API 관련 문제
Agreements
Service Level Agreement
개인 정보 보호 정책
데이터 처리 및 보안 계약
연락처
용어집

uni-app 직접 전송 실습

PDF
포커스 모드
폰트 크기
마지막 업데이트 시간: 2026-02-09 15:11:14

소개

이 문서는 SDK에 의존하지 않고 간단한 코드를 사용하여 uni-app에서 직접 파일을 COS(Cloud Object Storage, COS)의 버킷에 전송하는 방법을 소개합니다.
설명:
이 문서 내용은 XML API의 PostObject 인터페이스PutObject 인터페이스를 기반으로 합니다.

솔루션 설명

실행 과정

1. 프론트엔드에서 파일을 선택하면, 프론트엔드가 확장자를 서버로 전송합니다.
2. 서버 측은 확장자에 따라 시간이 포함된 임의의 COS 파일 경로를 생성하고, 해당 PostObject policy 서명을 계산한 후 URL과 서명 정보를 프론트엔드에 반환합니다.
3. 프론트엔드에서 PostObject 인터페이스 또는 PutObject 인터페이스를 호출하여 파일을 COS에 직접 업로드합니다.

솔루션 장점

경로 보안: 서버 측에서 결정한 임의의 COS 파일 경로를 사용하면 기존 파일의 덮어쓰기 문제와 보안 위험을 효과적으로 방지할 수 있습니다.
다중 플랫폼 호환성: uni-app에서 제공하는 파일 선택 및 업로드 인터페이스를 사용하면 하나의 코드로 다중 플랫폼(Web/미니프로그램/App)에서 호환 가능합니다.

전제 조건

1. COS 콘솔에 로그인하여 버킷을 생성하고, Bucket(버킷 이름) 및 Region(리전 이름)을 획득하십시오. 자세한 내용은 버킷 생성 문서를 참고하십시오.
2. CAM 콘솔에 로그인하여 프로젝트의 SecretId 및 SecretKey를 획득하십시오.
3. 방금 생성한 버킷 상세 페이지로 이동하여, 보안 관리 > 크로스 도메인 액세스 CORS 설정 페이지에서 규칙 추가를 클릭하십시오. 구성 예시는 아래 그림과 같습니다. 자세한 내용은 크로스 도메인 액세스 설정 문서를 참고하십시오.


작업 절차

주의:
정식 배포 전에 서버 측에 웹사이트 자체에 대한 권한 검증 계층을 추가하는 것이 좋습니다.

프론트엔드 업로드

1. post-policy 예제(PostObject 서버 측 인터페이스) 또는 put-sign 예제(PutObject 서버 측 인터페이스)를 참고하여 임의 파일 경로 생성, 서명 계산 및 프론트엔드에 반환하는 데 사용합니다.
2. HBuilderX 기본 템플릿(자세한 내용은 HBuilderX 공식 웹사이트 참조)을 사용하여 uni-app 애플리케이션을 생성합니다.
3. 파일 > 새로 만들기 > 프로젝트를 선택합니다. 생성 완료 후, 해당 애플리케이션은 Vue 기반 프로젝트가 됩니다.
4. 다음 코드를 복사하여 pages/index/index.vue 파일 내용을 대체하고, 호출하는 post-policy 인터페이스 링크를 수정하여 자신의 서버 주소(즉, 1단계의 서버 인터페이스)로 지정합니다.
PostObject 업로드
PutObject 업로드
<template>
<view class="content">
<button type="default" @click="selectUpload">파일 선택하여 업로드</button>
<image v-if="fileUrl" class="image" :src="fileUrl"></image>
</view>
</template>

<script>
export default {
data() {
return {
title: 'Hello',
fileUrl: ''
};
},
onLoad() {

},
methods: {
selectUpload() {

var vm = this;

// 더 많은 문자 인코딩의 url encode 형식
var camSafeUrlEncode = function (str) {
return encodeURIComponent(str)
.replace(/!/g, '%21')
.replace(/'/g, '%27')
.replace(/\\(/g, '%28')
.replace(/\\)/g, '%29')
.replace(/\\*/g, '%2A');
};

// 업로드 경로 및 인증서 획득
var getUploadInfo = function (extName, callback) {
// 파일 확장자를 전달하여 백엔드에서 임의의 COS 객체 경로를 생성하고, 업로드 도메인 및 PostObject 인터페이스에 필요한 policy 서명을 반환합니다.
// 서버 측 예제 참조: https://github.com/tencentyun/cos-demo/tree/main/server/post-policy
uni.request({
url: 'http://127.0.0.1:3000/post-policy?ext=' + extName,
success: (res) => {
// 반환 형식이 올바른지 확인
console.log(res);
callback && callback(null, res.data);
},
error(err) {
callback && callback(err);
},
});
};

// 업로드 요청 시작, PostObject 인터페이스를 사용하여 업로드하며 policy 서명으로 보호합니다.
// 인터페이스 문서:https://www.tencentcloud.com/document/product/436/14690#.E7.AD.BE.E5.90.8D.E4.BF.9D.E6.8A.A4
var uploadFile = function (opt, callback) {
var formData = {
key: opt.cosKey,
policy: opt.policy, // 이 값은 policy의 base64 문자열을 전달합니다.
success_action_status: 200,
'q-sign-algorithm': opt.qSignAlgorithm,
'q-ak': opt.qAk,
'q-key-time': opt.qKeyTime,
'q-signature': opt.qSignature,
};
// 서버 측에서 임시 키를 생성한 경우 x-cos-security-token을 전달해야 합니다.
if (opt.securityToken) formData['x-cos-security-token'] = opt.securityToken;
uni.uploadFile({
url: 'https://' + opt.cosHost, //예시일 뿐, 실제 인터페이스 주소가 아닙니다.
filePath: opt.filePath,
name: 'file',
formData: formData,
success: (res) => {
if (![200, 204].includes(res.statusCode)) return callback && callback(res);
var fileUrl = 'https://' + opt.cosHost + '/' + camSafeUrlEncode(opt.cosKey).replace(/%2F/g, '/');
callback && callback(null, fileUrl);
},
error(err) {
callback && callback(err);
},
});
};

// 파일 선택
uni.chooseImage({
success: (chooseImageRes) => {
var file = chooseImageRes.tempFiles[0];
if (!file) return;
// 업로드할 로컬 파일 경로 가져오기
var filePath = chooseImageRes.tempFilePaths[0];
// 업로드한 파일의 확장자를 가져와 백엔드에서 임의의 COS 경로 주소를 생성합니다.
var fileName = file.name;
var lastIndex = fileName.lastIndexOf('.');
var extName = lastIndex > -1 ? fileName.slice(lastIndex + 1) : '';
// 사전 업로드용 도메인, 경로, 자격 증명 가져오기
getUploadInfo(extName, function (err, info) {
// 반환된 info 형식이 올바른지 확인
console.log(info);
// 파일 업로드
info.filePath = filePath;
uploadFile(info, function (err, fileUrl) {
vm.fileUrl = fileUrl;
});
});
}
});
},
}
}
</script>

<style>
.content {
padding: 20px 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}

.image {
margin-top: 20px;
margin-left: auto;
margin-right: auto;
}
</style>
<template>
<view class="content">
<button type="default" @click="selectUpload">파일 선택하여 업로드</button>
<image v-if="fileUrl" class="image" :src="fileUrl"></image>
</view>
</template>

<script>
export default {
data() {
return {
title: 'Hello',
fileUrl: ''
};
},
onLoad() {

},
methods: {
selectUpload() {
var vm = this;
// 더 많은 문자 인코딩의 url encode 형식
var camSafeUrlEncode = function (str) {
return encodeURIComponent(str)
.replace(/!/g, '%21')
.replace(/'/g, '%27')
.replace(/\\(/g, '%28')
.replace(/\\)/g, '%29')
.replace(/\\*/g, '%2A');
};
// 업로드 경로 및 인증서 획득
var getUploadInfo = function (extName, callback) {
// 파일 확장자를 전달하여 백엔드에서 임의의 COS 객체 경로를 생성하고, PUT Object 인터페이스에 사용할 서명을 반환합니다.
// 백엔드는 다음 항목을 반환해야 함: cosHost, cosKey, authorization, securityToken(선택 사항)
uni.request({
url: 'http://127.0.0.1:3000/put-signature?ext=' + extName,
success: (res) => {
// 반환 형식이 올바른지 확인
console.log(res);
callback && callback(null, res.data);
},
fail(err) {
callback && callback(err);
},
});
};
// 파일을 ArrayBuffer로 읽기
var readFileAsArrayBuffer = function (filePath, callback) {
uni.getFileSystemManager().readFile({
filePath: filePath,
success: (res) => {
callback && callback(null, res.data); // res.data는 ArrayBuffer입니다
},
fail(err) {
callback && callback(err);
}
});
};
// 업로드 요청 시작, PUT Object 인터페이스 사용
// 인터페이스 문서:https://www.tencentcloud.com/document/product/436/7749
var uploadFile = function (opt, fileData, callback) {
var headers = {
'Authorization': opt.authorization, // 서명 정보
'Content-Type': opt.contentType || 'application/octet-stream'
};
// 서버 측에서 임시 키를 생성한 경우 x-cos-security-token을 전달해야 합니다.
if (opt.securityToken) {
headers['x-cos-security-token'] = opt.securityToken;
}
console.log('업로드 요청 정보:', {
url: 'https://' + opt.cosHost + '/' + opt.cosKey,
headers: headers
});

uni.request({
url: 'https://' + opt.cosHost + '/' + opt.cosKey,
method: 'PUT',
header: headers,
data: fileData, // ArrayBuffer 형식
success: (res) => {
console.log('업로드 응답:', res);
if (![200, 204].includes(res.statusCode)) {
console.error('업로드 실패, 상태 코드:', res.statusCode);
return callback && callback(res);
}
var fileUrl = 'https://' + opt.cosHost + '/' + camSafeUrlEncode(opt.cosKey).replace(/%2F/g, '/');
callback && callback(null, fileUrl);
},
fail(err) {
console.error('업로드 요청 실패:', err);
callback && callback(err);
},
});
};

// 파일 선택
uni.chooseImage({
success: (chooseImageRes) => {
var file = chooseImageRes.tempFiles[0];
if (!file) return;
// 업로드할 로컬 파일 경로 가져오기
var filePath = chooseImageRes.tempFilePaths[0];
// 업로드한 파일의 확장자를 가져와 백엔드에서 임의의 COS 경로 주소를 생성합니다.
var fileName = file.name;
var lastIndex = fileName.lastIndexOf('.');
var extName = lastIndex > -1 ? fileName.slice(lastIndex + 1) : '';
// 사전 업로드용 도메인, 경로, 서명 가져오기
getUploadInfo(extName, function (err, info) {
if (err) {
console.error('업로드 정보 가져오기 실패:', err);
return;
}
// 반환된 info 형식이 올바른지 확인
console.log(info);
// 파일을 ArrayBuffer로 읽기
readFileAsArrayBuffer(filePath, function (err, fileData) {
if (err) {
console.error('파일 읽기 실패:', err);
return;
}
// 파일 업로드
uploadFile(info, fileData, function (err, fileUrl) {
if (err) {
console.error('업로드 실패:', err);
return;
}
vm.fileUrl = fileUrl;
console.log('업로드 성공:', fileUrl);
});
});
});
}
});
},
}
}
</script>

<style>
.content {
padding: 20px 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}

.image {
margin-top: 20px;
margin-left: auto;
margin-right: auto;
}
</style>
5. HBuilderX에서 실행 > 브라우저에서 실행 > Chrome을 선택하면 브라우저에서 파일을 선택하여 업로드할 수 있습니다.
6. 실행 효과는 다음 그림과 같습니다.
프로젝트 생성:
uni-app 프로젝트 생성


직접 전송 효과:
uni-app 직접 전송 효과



관련 문서

도움말 및 지원

문제 해결에 도움이 되었나요?

피드백