인프런 커뮤니티 질문&답변

wooseong yang님의 프로필 이미지
wooseong yang

작성한 질문수

남박사의 파이썬으로 실전 웹사이트 만들기

글 작성 폼에 HTML 에디터 기능 추가하기

안녕하십니까 이미지 파일 업로드 부분 관련하여 질문 드립니다!

작성

·

345

1

안녕하십니까 이런 부분으로 질문드리게 되어 죄송합니다 ㅠ 

다만 이미지 업로드 부분에서 drag&drop 기능 및 

파일 선택 후 업로드 기능 전부 제대로 실행되지 않아 어려움을 겪고 있습니다

현재 로컬 폴더에 지정한 경로상으로 image를 드래그앤 드롭 하면 저장은 됩니다만 write.html 게시판 글 작성 상으로는 

이미지가 전혀 나타나질 않습니다 .  uploadImage()의 문제인 듯 하여 코드를 첨부했습니다 혹시 틀린 부분이 있다면 알려주시면 정말정말 감사할 듯 합니다!

//write.html -> uploadImage()
function uploadImage(image){
        print("<file upload>")
        var data = new FormData();
        data.append("image", image);
        $.ajax({
            url: "{{url_for('board.upload_image')}}", 
            cache: false,
            contentType: false, 
            processData: false,
            data: data, 
            type: "post",
            success: function(url){
                var image = $("<img>").attr("src", url).css('max-width', "900px");
                $("summernote").summernote("insertNode", image[0]);
            },
            error: function(data){
                console.log(data);
                alert(data);
            }
        });
    }

console log를 살펴봐도 다른 에러가 발생하지 않았으며

image파일은 게시판에 이미지를 올릴 때마다 차곡차곡 저장은 됩니다만 글 작성 내용에서는 전혀 포함이 되질 않습니다 

# board.py -> /upload_image, /images/<filename>

@blueprint.route("/upload_image", methods=["POST"])
def upload_image():
    if request.method == "POST":
        file = request.files["image"]
        if file and allowed_file(file.filename):

            filename = "{}.jpg".format(rand_generator())
            savefilepath=os.path.join(app.config["BOARD_IMAGE_PATH"], filename)
            file.save(savefilepath)
            return url_for("board.board_images", filename=filename)

@blueprint.route("/images/<filename>")
def board_images(filename):

    return send_from_directory(app.config["BOARD_IMAGE_PATH"], filename)

혹시 몰라 board.py 에 구현된 upload_image 항목 역시 첨부했습니다

답변 3

0

이거 해결이 되었나요? 저도 같은 증상인데, 원인을 모르겠네요

0

wooseong yang님의 프로필 이미지
wooseong yang
질문자

아 그 제가 지정한 BOARD_IMAGE_PATH에 저장이 된다는 말이었습니다

BOARD_IMAGE_PATH = "G:\\IT_SourceCode\\Python\\images"

경로는 위처럼 지정해뒀고

게시글을 작성할때 이미지를 드래그앤 드롭을 하면 이미지가 작성중에 아예 나오지 않습니다

그리고 에디터가 이미지를 인식을 못하는것 같습니다 그대로 게시글을 작성완료하려고 하면

내용을 작성하라는 에러메시지가 발생하는걸 보니 이미지 업로드가 되질 않는것 같습니다

이러한 오류가 발생하는 구간이 글 작성 도중 에디터를 사용할때 입니다.

드래그앤 드롭 하면 에디터에는 이미지가 보이지 않습니다만 제가 저장한 위 패스경로에는 이미지가 저장이 되어있습니다

그리고 print는 제가 코드 복붙하다 실수로 넣은 코드입니다,, ㅎ

이건 writehtml의 summernote 부분 코드 첨부했습니다

{% extends "main.html" %}
{% block contents %}
<script>
    $(document).ready(function () {
        $("#summernote").summernote({
            height:300,
            minheight: null,
            maxheight: null,
            lang: "ko-KR",
            popover: {
                image: [],
                link: [],
                air: []
            },
            callbacks: {
                onImageUpload: function(image) {
                    for(var i = 0 ; i < image.length ; i++) {
                        uploadImage(image[i]);
                    }
                }
            }
        });
    });

    function uploadImage(image){
        print("<file upload>")
        var data = new FormData();
        data.append("image"image);
        $.ajax({
            url: "{{url_for('board.upload_image')}}"
            cache: false,
            contentType: false
            processData: false,
            data: data
            type: "post",
            success: function(url){
                var image = $("<img>").attr("src"url).css('max-width'"900px");
                $("summernote").summernote("insertNode"image[0]);
            },
            error: function(data){
                console.log(data);
                alert(data);
            }
        });
    }
</script>
<script>
     function checkForm() {
        if($.trim($("#title").val()) == "") {
            alert("제목을 입력하세요");
            $("#title").focus();
            return false;
        }

        if($.trim($("#summernote").val()) == "") {
            alert("내용을 입력하세요");
            $("#summernote").focus();
            return false;
        }
   }

이건 board.py부분의 upload_image부분 코드입니다

@blueprint.route("/upload_image"methods=["POST"])
def upload_image():
    if request.method == "POST":
        file = request.files["image"]
        if file and allowed_file(file.filename):
            filename = "{}.jpg".format(rand_generator())
            savefilepath=os.path.join(app.config["BOARD_IMAGE_PATH"], filename)
            file.save(savefilepath)
            return url_for("board.board_images"filename=filename)

@blueprint.route("/images/<filename>")
def board_images(filename):
    return send_from_directory(app.config["BOARD_IMAGE_PATH"], filename)

혹시 몰라 common.py의 파일관련 코드도 첨부했습니다


def allowed_file(filename):
    return "." in filename and filename.rsplit("."1)[1in ALLOWED_EXTENSIONS
def rand_generator(length=8):
    char=ascii_lowercase + ascii_uppercase + digits
    return "".join(random.sample(char,length))

이건 main.html의 javascriptcdn과 summernote cdn 부분인데 혹시 몰라 이것도 첨부합니다 ㅠ

    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{title}}</title>
    <!-- CSS only -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
    <!-- JS, Popper.js, and jQuery -->
    <script src="https://code.jquery.com/jquery-3.5.1.min.js" type="text/javascript"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV" crossorigin="anonymous"></script>
    
<!-- include summernote css/js -->
    <link href="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.css" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.js"></script>
 

아무리 생각해도 write.html부분 에디터가 이미지를 왜 작성하지 못하는 것 같은데

몇 일간 서칭하고 해도 도저히 안되서 질문 드립니다 ㅠㅠ

로그상으로도 살펴보았습니다만

127.0.0.1 - - [21/Sep/2020 14:29:53] "POST /board/upload_image HTTP/1.1" 200 -

파일에러

127.0.0.1 - - [21/Sep/2020 14:29:53] "GET /board/images/M9b4Bo0v.jpg HTTP/1.1" 200 -

이미지 업로드 요청을 하면 글 작성 에디터에서는 보이질 않습니다만 지금은 심지어 인쇄창으로 넘어갑니다

뒤 상황은 동일합니다만 이미지를 업로드 받지 못합니다 에디터가 

하지만 제 로컬 폴더상에는 이미지가 저장이 되어있구요 ㅠㅠ

0

남박사님의 프로필 이미지
남박사
지식공유자

일단 이미지를 올릴때마다 차곡차곡 저장이 된다고 하셨는데 어디에 저장이 된다는 말씀이신지가 명확해야 할듯 합니다. 

savefilepath=os.path.join(app.config["BOARD_IMAGE_PATH"], filename)

업로드한 이미지가 코드에 있는 위 경로에 정확하게 저장이 되고 DB 에도 해당 경로가 저장이 되고 있는데 글 상세 페이지에선 안나온다는 말씀이신지요? 그렇다면 view 하는 코드를 확인해봐야 할듯 합니다만... 물론 위의 경로가 맞는지 부터 명확하게 확인해야 하고 db에도 위 경로로 제대로 저장되는지 100% 확신할만큼 확인하는게 우선일듯 합니다.

print("<file upload>")

그리고 자바스크립에서 위 문구가 정상 동작하나요? 제가 안써본 코드입니다만...

wooseong yang님의 프로필 이미지
wooseong yang

작성한 질문수

질문하기