質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2099閲覧

node.jsからformと同じような画像POSTのやり方

shibamata

総合スコア4

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/28 09:30

編集2021/11/28 09:43

別スレッドで自分なりに解決策を考え、それを達成するための相談していました。
相談していくうちに、そもそも対応方針がいけないのでは?と思い、今困っていることをどう解決したらいいか?の相談をさせてください。

現状、下記の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})();

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

js

1form.append('img_file', file);

の行を

js

1form.append("img_file", file, { filename: "img_file" });

として、

"content-type": "multipart/form-data" ,

の行は削除することで、python側で受信することができました!

投稿2021/11/28 14:10

shibamata

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問