ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Flask] 파일 업로드/삭제/수정
    공부/Flask 2021. 10. 4. 14:06

     

     

    write.html(거의비슷update.html)

    <!DOCTYPE html>
    <head>
        <!--css -->
        <link rel="stylesheet" type="text/css" href="/static/css/styles.css">
        <!-- ckeditor -->
        <script src="/static/ckeditor5/ckeditor.js"></script>
        <style>
            .ck-editor__editable {
                min-height: 400px;  
            }
        </style>
    </head>
    <body>
        <div class="container">
            <br>
            <h3>포스트 작성하기</h3><br>
            <form name="frm_pw" method="POST" enctype="multipart/form-data">
                <div class="form-group">
                    <label for="title">* 제목</label>
                    <input type="text" name="title" class="form-control" placeholder="제목을 입력하세요">
                </div>
                <div class="form-group">
                    <br>
                    <label for="title">* 비밀번호</label>
                    <input type="password" name="password" class="form-control">
                </div>
                <div class="form-group">
                    <br>
                    <label for="title">타이틀사진</label>
                    <input type="file" name="title_image" class="form-control">
                </div>
                <div class="form-group">
                    <br>
                    <label for="content">* 내용</label>
                    <textarea name="contents" id="editor" class="form-control" placeholder="내용 입력"></textarea>
                    <script>
    	ClassicEditor
    		.create( document.querySelector( '#editor' ), {
                language : {ui: 'ko', content: 'ko'}
    			// toolbar: [ 'heading', '|', 'bold', 'italic', 'link' ]
    		} )
    		.then( editor => {
    			window.editor = editor;
    		} )
    		.catch( err => {
    			console.error( err.stack );
    		} );
                    </script>
                </div>
                <br>
                <input style="font-size:100%; border:2px solid black; border-radius: 0.25rem;transition:box-shadow 0.15s ease-in-out;" type="submit" class="btn-primary">
            </form>     
        </div>
    </body>

     

    write python 부분

    @main.route('/write', methods=['GET','POST'])
    def write():
        if 'userid' not in session:
            #print("비로그인 상태")
            return "<script>alert(\'로그인 후 이용하세요.\');document.location.href=\"login_service/login\"</script>"
        if request.method == 'GET':
            return render_template('/main/write.html')
        #print("로그인 상태")
        title = request.form['title']
        password = request.form['password']
        contents = request.form['contents']
        if title=='' or password=='' or contents=='':
            return "<script>alert(\'* 은 필수입력입니다.\');document.location.href=\"/write\"</script>"
        
        #파일 업로드
        titleimg = request.files['title_image']
        fn = secure_filename(titleimg.filename) 
        if not fn:    #파일이 없으면
            fn = 'dummy-image.jpg'
        else:
            ######같은 이름 파일 업로드 중복처리.
            _ = 0
            while os.path.isfile("app/static/img/"+fn):
                fn = str(_)+fn
                _ += 1
            titleimg.save(os.path.join('app/static/img/'+ fn))
            
        #print(title,password,contents,request.remote_addr,session.get('userid'))
        db_class = dbModule.Database()    #db연결
        
        userid = session.get('userid')
        sql = "SELECT name from user where id=%s;"
        username = db_class.executeAll(sql, userid)    #username 받아오기
        
        sql = "INSERT INTO board (pwd, name, title, content, ip, viewcnt, titleimg) VALUES (%s, %s, %s, %s, %s, %s, %s);"
        args = (password, username[0]['name'], title, contents, request.remote_addr, 0, fn)
        
        #print(args)
        boards = db_class.executeAll(sql, args)
        db_class.commit()    
        return redirect('/')

     

    update python부분

    ## 글 수정하기
    @main.route('/update', methods=['GET','POST'])
    def update():
        if 'userid' not in session:
            #print("비로그인 상태")
            return "<script>alert(\'로그인 후 이용하세요.\');document.location.href=\"login_service/login\"</script>"
        
        #print("로그인 상태")
        db_class = dbModule.Database()    #db연결
        bid = request.args.get('bid')
        if request.method == 'GET':
            if request.args.get('bid')!=None and bid!='':
                sql = "SELECT * FROM board WHERE id=%s;"
                old_board = db_class.executeAll(sql, bid)
                return render_template('/main/update.html', old_board=old_board[0])
        
        # POST
        title = request.form['title']
        contents = request.form['contents']
        password = request.form['password']
        if title=='' or password=='' or contents=='':
            return "<script>alert(\'* 은 필수입력입니다.\');window.history.back();</script>"
        
        sql = "SELECT pwd, titleimg FROM board WHERE id=%s;"
        old_board = db_class.executeAll(sql, bid)
        if old_board[0]['pwd'] != password:
            return "<script>alert(\'비밀번호가 일치하지않습니다.\');window.history.back();</script>"
        
        titleimg = request.files['title_image']    #파일 업로드, 글 수정시 이전파일 삭제 후 업로드
        fn = secure_filename(titleimg.filename) 
        print(old_board, fn, titleimg.filename)
        if old_board[0]['titleimg']!=''and old_board[0]['titleimg']!=None and old_board[0]['titleimg']!='dummy-image.jpg' and fn:    #이미 파일이 있을때 업로드
            os.remove('app/static/img/' + old_board[0]['titleimg'])
            
        ######같은 이름 파일 업로드 중복처리.
        if fn:
            _ = 0
            while os.path.isfile("app/static/img/"+fn):
                fn = str(_)+fn
                _ += 1
            titleimg.save(os.path.join('app/static/img/'+ fn)) 
            sql = "UPDATE board SET title=%s, content=%s, titleimg=%s WHERE id=%s;"
            args = (title, contents, fn, bid)
        else:
            sql = "UPDATE board SET title=%s, content=%s WHERE id=%s;"
            args = (title, contents, bid)
        boards = db_class.executeAll(sql, args)
        db_class.commit()    
        
        sql = "SELECT * FROM board WHERE id=%s;"
        board = db_class.executeAll(sql, bid)
        return render_template('/main/board.html', board=board[0], num=bid)

     

     

Designed by Tistory.