Html 과 Javascript를 사용하여 S3 bucket에 존재하는 파일 및 폴더를 Html로 나타내고 폴더 클릭시 해당 폴더 하위 디렉토리로 이동 하게끔 구현, 파일 클릭시 해당 파일의 path 경로 나타나도록 구현해 보겠다.
1. 화면 구성
위 폴더 5개 a~e Prefix.replace("/", "")와 같은 방식으로 /를 제거해주고 화면에 나타내주고
아래는 .png 파일이다,
S3 bucket의 상태이다.
2. AWS.html의 파일 구성
<!DOCTYPE html>
<html>
<head>
<script src="./test.js"></script>
<script>
function getHtml(template) {
return template.join('\n');
}
listFiles();
</script>
</head>
<body>
<h1>S3 FileList</h1>
<div id="mono"></div>
<div id="di"></div>
</body>
</html>
3.test.js 전체 코드 파일 구성 BUCKETNAME, REGION, POOLID는 https://les-fourmis.tistory.com/52 에서 방법을 확인할 수 있다.해당 링크에 들어가서 각 값을 생성 후 생성 값을 입력해 주면 된다.
var fileBucketName = "BUCKETNAME";
var bucketRegion = "REGION";
var IdentityPoolId = POOLID";
AWS.config.update({
region: bucketRegion,
credentials: new AWS.CognitoIdentityCredentials({
IdentityPoolId: IdentityPoolId
})
});
var s3 = new AWS.S3({
apiVersion: "2006-03-01",
params: { Bucket: fileBucketName }
});
function listFiles() {
s3.listObjects({ Delimiter: "/", }, function(err, data) {
if (err) {
return alert("There was an error listing your files: " + err.message);
} else {
console.log(data);
var files = data.CommonPrefixes.map(function(commonPrefix) {
var prefix = commonPrefix.Prefix;
var fileName = decodeURIComponent(prefix.replace("/", ""));
return getHtml([
"<li>",
"<span onclick=\"viewFile('" + fileName + "')\">",
fileName,
"</span>",
"</li>"
]);
});
var message = files.length
? getHtml([
"<p>Click on an file name to view it.</p>",
])
: "<p>You do not have any files. Please Create album.";
var htmlTemplate = [
"<h2>Files</h2>",
message,
"<ul>",
getHtml(files),
"<li>",
data.Contents[data.Contents.length-1].Key,
"</li>",
"</ul>",
];
document.getElementById("mono").innerHTML = getHtml(htmlTemplate);
}
});
}
function viewFile(fileName){
var fileKey = encodeURIComponent(fileName) + "/";
s3.listObjects({ Prefix: fileKey, Delimiter: "/" }, function(err, data) {
if (err) {
return alert("There was an error viewing your file: " + err.message);
}
console.log(data);
var folderfiles = data.Contents.map(function(fold) {
var folderKey = fold.Key;
return getHtml([
"<span>",
"<div>",
"<span>",
"<input type='checkbox' class='DirCheck' onclick=\"Dir('" + folderKey + "')\">",
folderKey.replace(fileKey, ""),
"</input>",
"</span>",
"</div>",
"</span>",
]);
});
var message = folderfiles.length
? `Folder ${fileName} no files`
: "<p>You do not have any files in this file. Please add file.</p>";
console.log(data.CommonPrefixes);
if(data.CommonPrefixes.length !== 0){
var folderList = data.CommonPrefixes[data.CommonPrefixes.length-1].Prefix;
var htmlTemplate = [
"<h2>",
"folder: " + fileName,
"</h2>",
message,
"<div>",
getHtml(
folderfiles,
),
"<span onclick=\"folderfiles('" + folderList + "')\">",
folderList,
"</div>",
'<button onclick="listFiles()">',
"Back To Files",
"</button>",
"<br>",
"</br>",
];
document.getElementById("mono").innerHTML = getHtml(htmlTemplate);
document.getElementById("di").innerHTML = null;
}
else{
var htmlTemplate = [
"<h2>",
"folder: " + fileName,
"</h2>",
message,
"<div>",
getHtml(
folderfiles,
),
"</div>",
'<button onclick="listFiles()">',
"Back To Files",
"</button>",
"<br>",
"</br>",
];
document.getElementById("mono").innerHTML = getHtml(htmlTemplate);
document.getElementById("di").innerHTML = null;
}
});
}
function folderfiles(PrefixData){
s3.listObjects({ Delimiter: "/", Prefix: PrefixData }, function(err, data) {
if (err) {
return alert("There was an error listing your files: " + err.message);
} else {
console.log(data);
var files = data.CommonPrefixes.map(function(commonPrefix) {
var prefix = commonPrefix.Prefix;
var fileName = decodeURIComponent(prefix);
return getHtml([
"<li>",
"<span onclick=\"viewFile('" + fileName + "')\">",
fileName.replace(PrefixData, ''),
"</span>",
"</li>"
]);
});
var message = files.length
? getHtml([
"<p>Click on an file name to view it.</p>",
])
: "<p>You do not have any files. Please Create album.";
var htmlTemplate = [
"<h2>Files</h2>",
message,
"<ul>",
getHtml(files),
"<li>",
data.Contents[data.Contents.length-1].Key.replace(PrefixData, ''),
"</li>",
"</ul>",
'<button onclick="listFiles()">',
"Back To Files",
"</button>",
];
document.getElementById("mono").innerHTML = getHtml(htmlTemplate);
}
});
}
function Dir(e){
console.log(e);
let result = e;
document.getElementById("di").innerHTML = result;
}
s3.ListObjects() 는 아래의 형식을 가진다.
listFiles 함수를 보면 화면에 나타낼 때 Delimiter: "/" 를 사용해서 폴더파일 즉 a/ b/ c/ d/ e/ 폴더로 나뉘어 data.CommonPrefixes의 배열 값으로 나눠지고 나머지 값은 data.contents의 배열에 담기게 된다.
따라서 폴더 클릭시 onClick을 사용하여 viewfile 함수로 이동하여 해당 폴더의 파일들을 <div id="mono">로 화면에 뿌려주었고
나머지 값 폴더가 아닌 파일은
data.Contents[data.Contents.length-1].Key
를 사용하여 <div id="di">로 화면에 뿌려주었다.
'AWS' 카테고리의 다른 글
React Project AWS EC2 배포 하기 (1) | 2023.06.02 |
---|---|
AWS S3 bucket file Vue로 나타내기 (0) | 2023.03.22 |
S3 file upload (0) | 2023.03.15 |
AWS S3 버킷 생성 및 설정 (0) | 2023.03.14 |