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
개인 정보 보호 정책
데이터 처리 및 보안 계약
연락처
용어집
문서Cloud Object Storage

미니프로그램 직접 업로드 사례

포커스 모드
폰트 크기
마지막 업데이트 시간: 2026-01-07 17:15:01

소개

본 문서는 SDK에 의존하지 않고 간단한 코드로 미니프로그램에서 COS(Cloud Object Storage)의 버킷으로 파일을 직접 업로드하는 방법을 설명합니다.
주의:
본 문서의 내용은 XML 버전의 API를 기반으로 합니다.

전제 조건

1. COS 콘솔에 로그인하여 버킷을 생성하고 BucketName(버킷 이름)과 Region(리전 이름)을 설정하십시오. 자세한 내용은 버킷 생성 문서를 참고하십시오.
2. CAM 콘솔에 로그인하여 API 키 관리 페이지에서 프로젝트 SecretId와 SecretKey를 가져오십시오.
3. 미니프로그램 도메인 화이트리스트 구성
미니프로그램에서 COS 요청 시 WeChat 공식 플랫폼에 로그인하여 '개발' > '개발 설정'에서 도메인 화이트리스트를 구성해야 합니다. SDK는 두 개의 인터페이스인 wx.uploadFile 및 wx.request를 사용합니다.
cos.postObject는 wx.uploadFile을 사용하여 요청을 전송합니다.
다른 방법은 wx.request를 사용하여 요청을 전송합니다.
둘은 모두 해당 화이트리스트에 COS 도메인을 구성해야 합니다. 예: examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com.

솔루션 설명

실행 과정

1. 프론트엔드에서 파일을 선택하면, 프론트엔드가 확장자를 서버로 전송합니다.
2. 서버는 확장자에 따라 시간이 포함된 임의의 COS 파일 경로를 생성하고, 해당 서명을 계산하여 URL 및 서명 정보를 프론트엔드에 반환합니다.
3. 프론트엔드는 PUT 또는 POST 요청을 사용하여 파일을 COS에 직접 업로드합니다.

솔루션 장점

권한 보안: 서버 측 서명을 사용하면 안전한 권한 범위를 효과적으로 제한할 수 있으며, 지정된 하나의 파일 경로 업로드에만 사용 가능합니다.
경로 보안: 서버 측에서 결정한 임의의 COS 파일 경로를 사용하면 기존 파일의 덮어쓰기 문제와 보안 위험을 효과적으로 방지할 수 있습니다.

작업 절차

서버 측 서명 구성

주의:
정식 배포 시 서버 측에는 사용자의 웹사이트 자체 권한 검증 단계를 추가해야 합니다.
서명 계산 방법은 요청 서명 문서를 참고하십시오.
서버는 Node.js를 사용하여 서명을 계산합니다. Node.js 예제를 참고하십시오.
신규 사용자는 빠른 시작 문서를 참고하십시오.

미니프로그램 업로드 예제

구체적인 단계는 다음과 같습니다.

1. WeChat 미니프로그램 프로젝트를 생성하고, 개발자 도구를 열어 새 프로젝트를 생성한 후 AppID를 입력합니다.

2. 프로젝트에서 새 페이지를 찾거나 생성합니다(예: pages/index/index.js). 해당 페이지에 다음과 같은 직접 업로드 코드를 추가합니다.

3. 코드에서 해당 서버 주소를 수정합니다.

4. 서버는 Node.js를 사용하여 서명을 계산합니다. Node.js 예제를 참고하십시오.

5. WeChat 공식 플랫폼의개발 > 개발 설정에서 도메인 화이트리스트를 구성하고, SDK는 wx.uploadFile 및 wx.request 두 개의 인터페이스를 사용합니다.

다음 코드는 동시에 PUT Object 인터페이스(권장) 및 POST Object 인터페이스를 예시로 하며, 작업은 다음과 같습니다.

POST로 업로드

var uploadFile = function () {
// 더 많은 문자 인코딩의 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 getAuthorization = function (options, callback) {
wx.request({
method: 'GET',
// 해당 서버 주소를 수정하여 post 업로드 서명을 가져오기
url: 'http://127.0.0.1:3000/post-policy?ext=' + options.ext,
dataType: 'json',
success: function (result) {
var data = result.data;
if (data) {
callback(data);
} else {
wx.showModal({
title: '임시 키 가져오기 실패',
content: JSON.stringify(data),
showCancel: false,
});
}
},
error: function (err) {
wx.showModal({
title: '임시 키 가져오기 실패',
content: JSON.stringify(err),
showCancel: false,
});
},
});
};
/**
* prefix: cos 요청 url
* filePath: 미니프로그램에서 업로드할 파일의 경로 선택
* key: cos에 업로드할 경로
* formData: 서버에서 반환된 인증 매개변수
*/
var postFile = function ({ prefix, filePath, key, formData }) {
var requestTask = wx.uploadFile({
url: prefix,
name: 'file',
filePath: filePath,
formData: formData,
success: function (res) {
var url = prefix + '/' + camSafeUrlEncode(key).replace(/%2F/g, '/');
if (res.statusCode === 200) {
wx.showModal({ title: '업로드 성공', content: url, showCancel: false });
} else {
wx.showModal({
title: '업로드 실패',
content: JSON.stringify(res),
showCancel: false,
});
}
console.log(res.header['x-cos-request-id']);
console.log(res.statusCode);
console.log(url);
},
fail: function (res) {
wx.showModal({
title: '업로드 실패',
content: JSON.stringify(res),
showCancel: false,
});
},
});
requestTask.onProgressUpdate(function (res) {
console.log('진행 상황:', res);
});
};

// 파일 업로드
var uploadFile = function (filePath) {
var extIndex = filePath.lastIndexOf('.');
var fileExt = extIndex >= -1 ? filePath.substr(extIndex + 1) : '';
// 파일 확장자를 전송하여 서버가 서명이 포함된 url 생성하기
getAuthorization({ ext: fileExt }, function (AuthData) {
// AuthData 형식이 올바른지 확인
console.log(AuthData);
// 요청에 사용되는 매개변수
var prefix = 'https://' + AuthData.cosHost; // 요청 url
var key = AuthData.cosKey; // 보안 강화로 서버에서 파일명을 결정하기
var formData = {
key: key,
success_action_status: 200,
'Content-Type': '',
'q-sign-algorithm': AuthData.qSignAlgorithm,
'q-ak': AuthData.qAk,
'q-key-time': AuthData.qKeyTime,
'q-signature': AuthData.qSignature,
policy: AuthData.policy,
};
if (AuthData.securityToken)
formData['x-cos-security-token'] = AuthData.securityToken;
postFile({ prefix, filePath, key, formData });
});
};

// 파일 선택
wx.chooseMedia({
count: 1, // 기본값: 9
sizeType: ['original'], // 원본/압축 이미지 지정 가능, 기본적으로 원본 이미지를 사용함
sourceType: ['album', 'camera'], // 앨범/카메라 소스 지정 가능, 기본적으로 둘 다 포함됨
success: function (res) {
uploadFile(res.tempFiles[0].tempFilePath);
},
});
};

PUT로 업로드

var uploadFile = function () {
// 더 많은 문자 인코딩의 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 getAuthorization = function (options, callback) {
wx.request({
method: 'GET',
// 해당 서버 주소를 수정하여 put 업로드 서명을 가져오기
url: 'http://127.0.0.1:3000/put-sign?ext=' + options.ext,
dataType: 'json',
success: function (result) {
var data = result.data;
if (data) {
callback(data);
} else {
wx.showModal({
title: '임시 키 가져오기 실패',
content: JSON.stringify(data),
showCancel: false,
});
}
},
error: function (err) {
wx.showModal({
title: '임시 키 가져오기 실패',
content: JSON.stringify(err),
showCancel: false,
});
},
});
};

/**
* prefix: cos 요청 url
* filePath: 미니프로그램에서 업로드할 파일의 경로 선택
* key: cos에 업로드할 경로
* formData: 서버에서 반환된 인증 매개변수
*/
var putFile = function ({ prefix, filePath, key, AuthData }) {
// put 업로드 시 파일의 실제 내용을 읽어야 함
const wxfs = wx.getFileSystemManager();
wxfs.readFile({
filePath: filePath,
success: function (fileRes) {
var requestTask = wx.request({
url: prefix + '/' + key,
method: 'PUT',
header: {
Authorization: AuthData.authorization,
'x-cos-security-token': AuthData.securityToken,
},
data: fileRes.data,
success: function success(res) {
var url = prefix + '/' + camSafeUrlEncode(key).replace(/%2F/g, '/');
if (res.statusCode === 200) {
wx.showModal({
title: '업로드 성공',
content: url,
showCancel: false,
});
} else {
wx.showModal({
title: '업로드 실패',
content: JSON.stringify(res),
showCancel: false,
});
}
console.log(res.statusCode);
console.log(url);
},
fail: function fail(res) {
wx.showModal({
title: '업로드 실패',
content: JSON.stringify(res),
showCancel: false,
});
},
});
},
});
};

// 파일 업로드
var uploadFile = function (filePath) {
var extIndex = filePath.lastIndexOf('.');
var fileExt = extIndex >= -1 ? filePath.substr(extIndex + 1) : '';
getAuthorization({ ext: fileExt }, function (AuthData) {
// AuthData 형식이 올바른지 확인
console.log(AuthData);
const prefix = 'https://' + AuthData.cosHost;
const key = AuthData.cosKey;
putFile({ prefix, filePath, key, AuthData });
});
};

// 파일 선택
wx.chooseMedia({
count: 1, // 기본값: 9
sizeType: ['original'], // 원본/압축 이미지 지정 가능, 기본적으로 원본 이미지를 사용함
sourceType: ['album', 'camera'], // 앨범/카메라 소스 지정 가능, 기본적으로 둘 다 포함됨
success: function (res) {
uploadFile(res.tempFiles[0].tempFilePath);
},
});
};

관련 문서

미니프로그램 SDK를 사용하려면 미니프로그램 SDK 빠른 시작 문서를 참고하십시오.

도움말 및 지원

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

피드백