Object Storage
본인 고유 번호로 !!! 아니면 충돌 난다~!
파일명은 네이버클라우드에 저장되고
실제이미지는 Object Storage에 저장이 된다 !!!
Amazon 서버 설정
Folder: imageboard.service
File: NCPObjectStorageService.java
package imageboard.service;
public class NCPObjectStorageService{
private String accessKey = "";
}
이렇게 key를 주면 안 좋다. properties로 빼는게 좋다 ! 아니면 남들도 다 들어오므로
하지만 properties로 빼는건 나중에 할거임.
package imageboard.service;
public class NCPObjectStorageService{
private String accessKey = ""; //접근할 수 있는 키값
private String secretKey = ""; //보안 키값
private String regionName = "";
private String endPoint = "";
}
난 두 개가 있는데,,, 일단 밑에껄로 했다 !
package imageboard.service;
public class NCPObjectStorageService{
private String accessKey = "DA4C49B42C898921242E"; //접근할 수 있는 키값
private String secretKey = ""; //보안 키값
private String regionName = "kr-standard";
private String endPoint = "https://kr.object.ncloudstorage.com";
}
final AmazoneS3 s3;
이 Amazon을 사용하려면 jar 파일이 많이 필요하다 !! 다운받아보자 !!
① aws-java-sdk-s3 검색
② aws-java-sdk-core 검색 - 스프링에서 할때는 자동으로 의존성이 처리되지만, 여기서는 직접 jar를 넣어주어야 한다.
aws-java-sdk-s3-1.12.767.jar
aws-java-sdk-core-1.12.767.jar
commons-logging
jackson-databind
jackson-core
jackson-annotations
httpclient
httpcore
joda-time
jaxb-api
aws-java-sdk-s3-1.12.767.jar
aws-java-sdk-core-1.12.767.jar
commons-logging
jackson-databind
jackson-core
jackson-annotations
httpclient
httpcore
joda-time
jaxb-api
D:\AWS S3\lib
서버끄고 프로젝트 Clean 하기 !!
AmazonS3가 import 되는 것을 확인할 수 있다.
package imageboard.service;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
public class NCPObjectStorageService{
private String accessKey = "DA4C49B42C898921242E"; //접근할 수 있는 키값
private String secretKey = ""; //보안 키값
private String regionName = "kr-standard";
private String endPoint = "https://kr.object.ncloudstorage.com";
final AmazonS3 s3; //s3 - Object Storage 보관하는 곳
public NCPObjectStorageService() {
s3 = AmazonS3ClientBuilder
.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
.build();
}
}
s3 - Object Storage 보관하는 곳
s3에 대해 환경설정을 잡아주는데 endPoint로 저장할 수 있는 포인트 줌
imageboardWriteAJaxService.java
//실제폴더
String realFolder = request.getServletContext().getRealPath("/storage");
System.out.println("realFolder = " + realFolder);
storage라는 realFolder로 올라간다.
MultipartRequest multi = new MultipartRequest(
request,
realFolder, //이미지가 저장되는 위치
5 * 1024 * 1024, //5MB
"UTF-8",
new DefaultFileRenamePolicy());
여기까지해서 이미지가 업로드 된다.
//데이터
String imageId = multi.getParameter("imageId");
String imageName = multi.getParameter("imageName");
int imagePrice = Integer.parseInt(multi.getParameter("imagePrice"));
int imageQty = Integer.parseInt(multi.getParameter("imageQty"));
String imageContent = multi.getParameter("imageContent");
String image1 = multi.getOriginalFileName("image1");
String fileName = multi.getFilesystemName("image1"); //파일명만 DB에 저장
데이터 얻어왔다.
fileName
file에대한 정보를 가지고있는게 아닌 이름만 가지고 있기 때문에 파일정보 객체를 생성해준다.
파일 객체 생성
//파일 객체 생성
File file = new File(realFolder, image1);
Object Storage(NCP)의 새로운 이미지 올리기
//Object Storage(NCP)의 새로운 이미지 올리기
NCPObjectStorageService ncp = new NCPObjectStorageService();
업로드하려면 필요한 것
우리는 bucket이라는 것을 생성해놨다.
그 이름 필요 !!
public class ImageboardWriteAJaxService implements CommandProcess {
private String bucketName = "bitcamp-9th-bucket-132";
//Object Storage(NCP)의 새로운 이미지 올리기
NCPObjectStorageService ncp = new NCPObjectStorageService();
ncp.uploadFile(bucketName, "storage/", file);
NCPObjectStorageService.java
fileIn = new FileInputStream(file);
파일 안에 있는 이름을 읽어와라
ObjectMetadata objectMetadata = new ObjectMetadata();
Metadata는 파일의 정보를 얘기하는 것 jpa, png ~~ 이런거랑 파일의 크기 이런 거 올려야하는데 metadate가 담고 있다.
objectMetadata.setContentType("image/jpeg");
이런식으로 contentType을 잡아버리면 다른 png, jpg이런건 안올라간다.
이렇게하면 if문으로 걸어야되는데
이렇게 하기 싫으므로 !!!
Path path = Paths.get(file.getAbsolutePath());
절대경로를 얻어와서 파일이 어떤 파일인지 알아내는 것 !
String contentType = null;
try {
contentType = Files.probeContentType(path);
} catch (IOException e) {
e.printStackTrace();
}
objectMetadata.setContentType(contentType); //파일의 contentType도 잡았고
objectMetadata.setContentLength(file.length()); //파일의 길이도 잡았다.
파일의 contentType도 잡았고 파일의 길이도 잡았다.
PutObjectRequest putObjectRequest =
new PutObjectRequest(bucketName,
directoryPath + fileName,
fileIn,
objectMetadata)
.withCannedAcl(CannedAccessControlList.PublicRead); //리소스에 대한 접근 권한
//모든 사용자가 객체를 읽을 수 있지만, 수정과 삭제는 불가능하다. -- 나만 가능하다는 것
객체까지 다 만들었으니 이제 올리자.
s3.putObject(putObjectRequest);
이렇게 하면 이제 올라가는 것 !
NCPObjectStorageService.java 전체코드
package imageboard.service;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
public class NCPObjectStorageService{
private String accessKey = "DA4C49B42C898921242E"; //접근할 수 있는 키값
private String secretKey = ""; //보안 키값
private String regionName = "kr-standard";
private String endPoint = "https://kr.object.ncloudstorage.com";
final AmazonS3 s3; //s3 - Object Storage 보관하는 곳
public NCPObjectStorageService() {
s3 = AmazonS3ClientBuilder
.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
.build();
}
public void uploadFile(String bucketName, String directoryPath, File file) {
String fileName = file.getName();
FileInputStream fileIn = null;
try {
fileIn = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
ObjectMetadata objectMetadata = new ObjectMetadata();
//objectMetadata.setContentType("image/jpeg");
Path path = Paths.get(file.getAbsolutePath());
String contentType = null;
try {
contentType = Files.probeContentType(path);
} catch (IOException e) {
e.printStackTrace();
}
objectMetadata.setContentType(contentType);
objectMetadata.setContentLength(file.length());
PutObjectRequest putObjectRequest =
new PutObjectRequest(bucketName,
directoryPath + fileName,
fileIn,
objectMetadata)
.withCannedAcl(CannedAccessControlList.PublicRead); //리소스에 대한 접근 권한
//모든 사용자가 객체를 읽을 수 있지만, 수정과 삭제는 불가능하다.
s3.putObject(putObjectRequest);
}
}
이미지 등록해보기 !
https://kr.object.ncloudstorage.com/bitcamp-9th-bucket-132/storage/%EC%82%AC%EA%B3%BC.jpg
https://kr.object.ncloudstorage.com/bitcamp-9th-bucket-132 이거 그대로 복사해서
imageboardList.jsp
<td>
<a href="#">
<!-- src="가상폴더의 위치" -->
<img src="https://kr.object.ncloudstorage.com/bitcamp-9th-bucket-132/storage/${imageboardDTO.getImage1()}" alt="${imageboardDTO.getImageName()}" width="100" height="100" />
</a>
</td>
이렇게 지우려하니 에러 발생한다 !!!
delete from imageboard;
11:11:25 delete from imageboard Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect. 0.672 sec
얘를 해제하던가 ! 아니면
set sql_safe_updates=0;
이렇게하면 lock이 풀린다.
delete from imageboard;
다시하면 잘 지워지는 거 확인 가능 !!
잘 올라온 거 확인 가능 !!
이렇게 같은 거 두 개 올리게 되면 하나만 올라온다.
계속 다르게 올리고싶으면
NCPObjectStorageService.java
public void uploadFile(String bucketName, String directoryPath, File file) {
//String fileName = file.getName();
String fileName = UUID.randomUUID().toString();
이렇게하면 숫자형식으로 다르게 올라가게된다.
똑같은 이미지를 올려도 이런식으로 다르게 올라간다.
그러므로 나중에 확인할 때는 날짜로 확인해야한다.
코드 추가하기 !!
NCPObjectStorageService.java
public String uploadFile(String bucketName, String directoryPath, File file) {
return fileName;
ImageboardWriteAJaxService.java
image1 = ncp.uploadFile(bucketName, "storage/", file);
select * from imageboard;
위에처럼 해야 DB에도 저런식으로 숫자로 올라가는 거 확인할 수 있다 !!
'NCP' 카테고리의 다른 글
네이버 클라우드 플랫폼 자격증 (NCP) (0) | 2024.12.03 |
---|---|
DAY 103 - NCA 특강 (2024.12.02) (0) | 2024.12.03 |
DAY 92 - NCPSpringBootReactGradle 배포 (2024.11.15) (0) | 2024.11.15 |
DAY 69 - NCP 서버에 프로젝트 올리기 (2024.10.15) (0) | 2024.10.15 |
DAY 57 - NCP ( 2024.09.25 ) (1) | 2024.09.25 |