python/웹

Flask - Html 파일/이미지 전송

끼발자 2021. 11. 18. 11:33
반응형

지금은 페이지에서 파일을 업로드하고 서버에 저장하는 작업을 진행해보자.

 

파일 선택 - 업로드의 간단한 페이지이니 따로 html을 만들기보단

직접 return에 html을 작성하자

 

@app_fun.route('/file_upload')
def file():
    return '''<form action="/file_upload" method="POST" enctype = "multipart/form-data">
            <input type = "file" name = "file" />            
            <input type='submit'>
            '''

위와 같은 화면이 나온다.

파일을 선택해서 제출하게되면 form action의 url로 post 방식으로 데이터를 전달한다.

파일을 담아서 던져줘야하기때문에 enctype = "multipart/form-data" 를 명시해주자.

 

같은 url에 get / post를 이용해서 다른 기능을 구현해보자.

 

@app_fun.route('/file_upload',methods = ['GET','POST'])
def file():
    return '''<form action="/file_upload" method="POST" enctype = "multipart/form-data">
            <input type = "file" name = "file" />            
            <input type='submit'>
            '''

 

methods가 추가된 것을 볼 수 있다.

 

전달된 파일은 request.files로 전달되고, 

ImmutableMultiDict([('file', <FileStorage: 'cat.jpeg' ('image/jpeg')>)])

이렇게 전달된다. 

우리는 file을 담아 저장하면 되니 아래와 같이 바이트로 읽은 뒤 with open을 이용해서 저장하자.

 

@app_fun.route('/file_upload',methods = ['GET','POST'])
def file():
    if request.method == 'POST':
        file = request.files['file']
        f = file.read()
        name = file.filename
        with open(name,'wb') as F:
            F.write(f)
        return redirect(main)

    return '''<form action="/file_upload" method="POST" enctype = "multipart/form-data">
            <input type = "file" name = "file" />            
            <input type='submit'>
            '''
반응형