2차 프로젝트: 중간 정리 (5)

Hyeon Soo·2021년 3월 11일
0

이미지나 파일 등을 업로드 할 때, django의 저장공간을 이용할 수도 있지만, 이는 용량을 많이 요구하기 때문에 적절하지 않을 수 있다. 대신 아마존에서 제공하는 s3 서비스를 이용할 경우, 저장할 때의 url만 데이터베이스에 저장하고 필요할 때 불러올 수 있다.

S3서비스를 이용하기 위한 기본 설정은
https://ssungkang.tistory.com/entry/Django-AWS-S3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%97%85%EB%A1%9C%EB%93%9C

https://www.enteroa.com/2020/11/05/s3-%EB%B2%84%ED%82%B7-cors-%EC%84%A4%EC%A0%95-json/
를 이용하면 기본적인 세팅을 마칠 수 있다. 시점에 따라 s3 설정을 다르게 해야할 수는 있다.
설정을 마쳤다면, view를 작성할 필요가 있다. 파일의 경우, 다음과 같이 구현할 수 있다.

class ResumeFilewUploadView(View):
    @login_decorator
    def post(self, request):
        user = request.user

        if request.FILES.__len__() == 0:#요청에 파일이 제대로 담겨왔는지 검사
            return JsonResponse({"message": "FILE_DOES_NOT_EXIST"}, status=400)

        file = request.FILES['resume']#키값을 임의로 지정해 줄 수 있다.
        
        if file.name.find('pdf') < 0:#pdf파일만을 업로드 받기 위해 작성. 필요시 생략해도 된다.
            return JsonResponse({"message": "PLEASE_UPLOAD_PDF"}, status=400)
        
        s3_client = boto3.client(#boto3로 s3에 요청을 보낼시 필요한 값들
            's3',
            aws_access_key_id = S3KEY,
            aws_secret_access_key = S3SECRETKEY
            )
        url_generator = str(uuid.uuid4())
        s3_client.upload_fileobj(#파일을 업로드 하는 명령어
                file,  #업로드 하려는 파일파일
                "wantusfile",#버킷의 이름
                url_generator,#객체의 이름. url에 말미에 붙어 저장된다.
                ExtraArgs = {
                    "ContentType": file.content_type,#타입을 지정해주는 명령어
                    }
                )
        file_url = f"https://wantusfile.s3.ap-northeast-2.amazonaws.com/{url_generator}"
        resume   = ResumeFile.objects.create(user=user, title=file.name, file_url=file_url, uuidcode=url_generator)
        return JsonResponse({'message': 'SUCCESS', 'data': file_url}, status=200)

업로드 하고자 하는 파일의 종류와 처치에 따라 코드는 달라질 수 있다.

0개의 댓글