Vue.js+Flask로 이미지 업로드 기능
개요
이번에는 프런트 엔드에 Vue.js, 백엔드에 Flask를 이용한 이미지 인식 앱을 만듭니다.
일단 이번은 이미지 업로드 기능까지의 구현입니다.
환경
위의 환경에서 환경을 구축했습니다.
자세한 지침과 자세한 내용은 아래 링크를 참조하십시오.
Vue + Flask on Docker
요소 설명
Vue
자세한 내용은 다음 코드입니다.
Home.vue// 画像をサーバーへアップロード
onUploadImage () {
var params = new FormData()
params.append('image', this.uploadedImage)
// Axiosを用いてFormData化したデータをFlaskへPostしています。
axios.post(`${API_URL}/classification`, params).then(function (response) {
console.log(response)
})
// 画像をサーバーへアップロード
onUploadImage () {
var params = new FormData()
params.append('image', this.uploadedImage)
// Axiosを用いてFormData化したデータをFlaskへPostしています。
axios.post(`${API_URL}/classification`, params).then(function (response) {
console.log(response)
})
Flask
자세한 내용은 다음 코드입니다.
app.py
@app.route('/classification', methods=['POST'])
def uploadImage():
if request.method == 'POST':
base64_png = request.form['image']
code = base64.b64decode(base64_png.split(',')[1])
image_decoded = Image.open(BytesIO(code))
image_decoded.save(Path(app.config['UPLOAD_FOLDER']) / 'image.png')
return make_response(jsonify({'result': 'success'}))
else:
return make_response(jsonify({'result': 'invalid method'}), 400)
전체상
Vue
Home.vue<template>
<div>
<div class="imgContent">
<div class="imagePreview">
<img :src="uploadedImage" style="width:100%;" />
</div>
<input type="file" class="file_input" name="photo" @change="onFileChange" accept="image/*" />
<button @click='onUploadImage'>画像判定してくだちい・・・</button>
</div>
</div>
</template>
<script>
import axios from 'axios'
const API_URL = 'http://127.0.0.1:5000'
export default {
data () {
return {
uploadedImage: ''
}
},
methods: {
// 選択した画像を反映
onFileChange (e) {
let files = e.target.files || e.dataTransfer.files
this.createImage(files[0])
},
// アップロードした画像を表示
createImage (file) {
let reader = new FileReader()
reader.onload = (e) => {
this.uploadedImage = e.target.result
}
reader.readAsDataURL(file)
},
// 画像をサーバーへアップロード
onUploadImage () {
var params = new FormData()
params.append('image', this.uploadedImage)
// Axiosを用いてFormData化したデータをFlaskへPostしています。
axios.post(`${API_URL}/classification`, params).then(function (response) {
console.log(response)
})
}
}
}
</script>
Flask
유의점
<template>
<div>
<div class="imgContent">
<div class="imagePreview">
<img :src="uploadedImage" style="width:100%;" />
</div>
<input type="file" class="file_input" name="photo" @change="onFileChange" accept="image/*" />
<button @click='onUploadImage'>画像判定してくだちい・・・</button>
</div>
</div>
</template>
<script>
import axios from 'axios'
const API_URL = 'http://127.0.0.1:5000'
export default {
data () {
return {
uploadedImage: ''
}
},
methods: {
// 選択した画像を反映
onFileChange (e) {
let files = e.target.files || e.dataTransfer.files
this.createImage(files[0])
},
// アップロードした画像を表示
createImage (file) {
let reader = new FileReader()
reader.onload = (e) => {
this.uploadedImage = e.target.result
}
reader.readAsDataURL(file)
},
// 画像をサーバーへアップロード
onUploadImage () {
var params = new FormData()
params.append('image', this.uploadedImage)
// Axiosを用いてFormData化したデータをFlaskへPostしています。
axios.post(`${API_URL}/classification`, params).then(function (response) {
console.log(response)
})
}
}
}
</script>
app.py
# render_template:参照するテンプレートを指定
# jsonify:json出力
from flask import Flask, render_template, jsonify, request, make_response
# CORS:Ajax通信するためのライブラリ
from flask_restful import Api, Resource
from flask_cors import CORS
from random import *
from PIL import Image
from pathlib import Path
from io import BytesIO
import base64
# static_folder:vueでビルドした静的ファイルのパスを指定
# template_folder:vueでビルドしたindex.htmlのパスを指定
app = Flask(__name__, static_folder = "./../frontend/dist/static", template_folder="./../frontend/dist")
#日本語
app.config['JSON_AS_ASCII'] = False
#CORS=Ajaxで安全に通信するための規約
api = Api(app)
CORS(app)
UPLOAD_FOLDER = './uploads'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
# 任意のリクエストを受け取った時、index.htmlを参照
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def index(path):
return render_template("index.html")
@app.route('/classification', methods=['POST'])
def uploadImage():
if request.method == 'POST':
base64_png = request.form['image']
code = base64.b64decode(base64_png.split(',')[1])
image_decoded = Image.open(BytesIO(code))
image_decoded.save(Path(app.config['UPLOAD_FOLDER']) / 'image.png')
return make_response(jsonify({'result': 'success'}))
else:
return make_response(jsonify({'result': 'invalid method'}), 400)
# app.run(host, port):hostとportを指定してflaskサーバを起動
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
모습
이런 느낌
매우 도움이되었습니다.
htps : //로 ゔぇぺぺr. 모잖아. 오 rg / 그럼 / cs / u b / Ht tP / RS
이미지를 POST, 얼굴 감지, 캔버스로 얼굴에 그리기
Reference
이 문제에 관하여(Vue.js+Flask로 이미지 업로드 기능), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/rockguitar67/items/f8edc33dd221d8f4e965
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
htps : //로 ゔぇぺぺr. 모잖아. 오 rg / 그럼 / cs / u b / Ht tP / RS
이미지를 POST, 얼굴 감지, 캔버스로 얼굴에 그리기
Reference
이 문제에 관하여(Vue.js+Flask로 이미지 업로드 기능), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/rockguitar67/items/f8edc33dd221d8f4e965텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)