別スレッドで自分なりに解決策を考え、それを達成するための相談していました。
相談していくうちに、そもそも対応方針がいけないのでは?と思い、今困っていることをどう解決したらいいか?の相談をさせてください。
現状、下記のHTMLからpython(flask)へ画像をPOSTして画像解析を行っています。
画像解析を行うサーバーの間にnode.jsで動作するサーバーを挟みたいと考えています。
【いままで】
HTMLからpythonに画像をPOST
【これからやりたいこと】
HTMLからnode.jsにPOSTして、画像データ部分は同じ内容をpythonにPOST
そこで、下記を実装したのですが、node.jsが受け取るデータがBuffer形式で、どのようにしたらPython側にいままでのPOSTと同じように画像を渡せるのかがわかりません。(Buffer形式は文字列として認識されてopencv側はエラーとなってしまいました。)
formから送信していた際は問題なく画像処理ができていたので、formから送るのと同じようにnode.jsから画像をPOSTしたいです。
node.jsがpostで受け取った画像をそのまま別サーバーへPOSTする良い方法はありませんか?
HTML
1 2<!DOCTYPE html> 3<html lang="ja"> 4<head> 5 <meta charset="UTF-8"> 6 <title>File</title> 7</head> 8<body> 9 <!-- 下記のアクション./をnode.js宛にして、応答を得たい --> 10 <form method="post" action="./" enctype="multipart/form-data"> 11 <input type="file" id="img_file" name="img_file"> 12 <input type="submit" value="送信"> 13 </form> 14 <p> 15hoge 16 </p> 17</body> 18</htmt>
python
1from flask import Flask, render_template, request, redirect, url_for, send_from_directory, session 2import io 3import os 4import cv2 5import numpy as np 6from werkzeug.utils import secure_filename 7from werkzeug.datastructures import FileStorage 8 9app = Flask(__name__) 10 11@app.route('/', methods=['GET', 'POST']) 12def index(): 13 if request.method == 'POST': 14 type(request.files) 15 img_file = request.files['img_file'] 16 f = img_file.stream.read() 17 bin_data = io.BytesIO(f) 18 file_bytes = np.asarray(bytearray(bin_data.read()), dtype=np.uint8) 19 img = cv2.imdecode(file_bytes, cv2.IMREAD_COLOR) 20 return str(len(img)) 21 else: 22 # ファイルが送信されていない場合、htmlを表示する 23 return render_template('index.html') 24 25if __name__ == '__main__': 26 app.debug = True 27 app.run() 28
js
1const fs = require('fs'); 2const Hapi = require('hapi'); 3const path = require('path'); 4 5const serverOptions = { 6 host: 'localhost', 7 port: 8080, 8 routes: { 9 cors: { 10 origin: ['*'], 11 }, 12 }, 13}; 14 15const server = new Hapi.Server(serverOptions); 16function testResponse(req){ 17 //-------------------------------------- 18 // ここでなんらかの処理をBuffer型になってしまった画像をどうにかしたい! 19 //-------------------------------------- 20 const pythonresult = new Promise(function(callback) { 21 const FormData = require('form-data'); 22 // pythonを叩くurlを指定 23 const url = 'http://127.0.0.1:5000/'; 24 const form = new FormData(); 25 form.append('img_file', file); 26 const head = {headers: { 27 "content-type": "multipart/form-data" , 28 ...form.getHeaders(), 29 },}; 30 const axios = require('axios'); 31 // post 32 axios.post(url,form,head ) 33 .then(response => { 34 callback(response.data); 35 }) 36 .catch(error => { 37 callback(error); 38 }) 39 .finally(() => { 40 }); 41 }); 42 return pythonresult; 43} 44 45// 以下の処理を常駐させる 46(async () => { 47 // テスト用 48 server.route({ 49 method: 'POST', 50 path: '/test', 51 handler: function (request, reply) { 52 return testResponse(request); 53 } 54 }); 55 // サーバーを動かす 56 await server.start(); 57})();
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。