본문 바로가기
공부/프로그래밍

[python-django] 파일 업로드(CSV파일) 및 파일내용 읽기

by demonic_ 2018. 10. 5.
반응형

CSV 파일을 업로드하여 내용을 읽는 기능을 구현하려 합니다.

여기서는 $.ajax 를 이용하여 전송하는 방법을 사용했습니다.


업로드하려는 csv 샘플파일 내용이 다음과 같습니다.


책이름, ISBN번호

동물농장, 9788901082059

나미야 잡화점의 기적, 9788972756194




- Front 쪽의 설명입니다.


input type='file' 을 생성하고 이것이 바뀔때마다 file 객체가 특정 object에 담기도록 합니다.

file 객체를 console.log 로 찍어보면 다음과같은 정보가 저장되어 있음을 확인할 수 있습니다.


File

lastModified: 1538653427942

lastModifiedDate: Thu Oct 04 2018 20:43:47 GMT+0900 (한국 표준시) {}

name: "sample (1).csv"

size: 77

type: "text/csv"

webkitRelativePath: ""

__proto__: File


이제 이 객체를 FormData()를 생성하여 넣어주도록 합니다.

POST로 전송해야 하기 때문에 csrf_token을 같이 포함하여 전송해주어야 합니다.

안그러면 403 에러가 발생합니다.


$.post대신 $.ajax를 사용하는 이유는 좀더 상세한 옵션설정이 필요해서인데, 파일업로드 할때에는 ajax의 옵션중 processData 와 contentType 옵션을 둘다 false로 수정해야 합니다.


% processData 는 data 지정한 개체를 쿼리 문자열로 변환할지 여부를 설정하는 것입니다. 기본값은 true이며 자동으로 "application/x-www-form-urlencoded" 형식으로 변환합니다. file의 경우 form으로 전송시 multipartfile 으로 전송되기 때문에 자동변환하면 안됩니다.

% contentType 의 기본값은 "application/x-www-form-urlencoded" 입니다. 이것또한 false로 변경합니다.


let formData = new FormData();

formData.append('file', 파일객체);

formData.append('csrfmiddlewaretoken', '{{ csrf_token }}')

let url = "/upload";

$.ajax({

    url: url,

    data: formData,

    processData: false,

    contentType: false,

    type: 'POST',

    success: function(res){

        displayLoading("N"); // 로딩 off

        alert(res.message)

        return false;

    }

})




- Django(python) 쪽 설명입니다.


업로드 파일을 받기위해 urls.py에 다음과 같이 설정합니다.(파일명은 서버의 환경에 따라 다를 수 있습니다.)


# urls.py 파일

path('/upload', test.upload, name="test.upload"),



test.py 파일 내에 upload function을 추가합니다.


# test.py 파일

def like_upload(request):

# 파일객체가 하나도 없다면 작업을 멈추고 리턴합니다.

if request.FILES.__len__() == 0:

message = "업로드할 파일이 없습니다."

return JsonResponse({"message": message})



uploadFile = request.FILES['file'];

# csv파일이 아니라면 작업을 멈추고 리턴합니다.

if uploadFile.name.find('csv') < 0 :

message = "파일형식이 잘못되었습니다"

return JsonResponse({"message": message})



# 여기서 read()를 실행할 경우 타입이 byte로 읽힙니다.

# 이것을 utf8로 디코드해서 문자열을 볼 수 있도록 바꿔둡니다. 

read = uploadFile.read().decode('utf8')

# 줄바꿈이 생기는 것을 기준으로 배열로 담아둡니다.

readLine = read.split('\n')


for line in readLine:

print(line)



그럼 다음과같이 Log 가 찍힙니다.


책이름, ISBN번호

동물농장, 9788901082059

나미야 잡화점의 기적, 9788972756194





반응형

댓글