У меня есть очень простой Flask API, который работает с моделью DNN.
Бэкэнд Python выглядит так:
from flask import request
from flask import jsonify
from flask import Flask
import io
app = Flask(__name__)
@app.route("/predict", methods=["POST"])
def predict():
response = {"success": False}
if request.method == "POST":
if request.files.get("image"):
image = request.files["image"].read()
image = Image.open(io.BytesIO(image))
#...
response = {"success": True}
else:
print('Wrong file')
else:
print('Wrong method')
return jsonify(response)
Упрощенный интерфейс JavaScript:
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<meta name = "viewport" content = "width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<input id = "image_selector" type = "file">
<button id = "predict_button">Predict</button>
<p style = "font-weight: bold;">Predictions</p>
<p>Prediction: <span id = "prediction_text"></span></p>
<img id = "selected-image" src = "">
<script src = "https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script>
let base64Image
var fd = new FormData();
$('#image_selector').change(function() {
let reader = new FileReader()
reader.onload = function(e) {
let dataURL = reader.result
$('#selected-image').attr("src", dataURL)
base64Image = dataURL.replace("data:image/jpeg;base64,", "")
console.info(base64Image)
}
fd.append('file', $('#image_selector')[0].files[0])
reader.readAsDataURL($('#image_selector')[0].files[0])
$('#prediction_text').text("")
})
$('#predict_button').click(function(event) {
let message = {
image: base64Image
}
console.info(message)
$.ajax({
url: "http://localhost:5000/predict",
type: 'POST',
data:fd,
contentType: false,
processData: false,
success: function (response) {
if (response.error) {
$('#prediction_text').text('ERROR')
}
else {
$('#prediction_text').text(response.prediction)
}
console.info(response)
},
error: function () {
},
});
})
</script>
</body>
</html>
Когда я пытаюсь опубликовать файл изображения, в приложении Flask изображение не может передать второй if
и печатает «Неверный файл».
Поскольку эта команда cURL работает отлично:
curl -X POST -F [email protected] 'http://127.0.0.1:5000/predict'
Я предполагаю, что есть проблема с форматом файла, но я не уверен, что это такое.
попробуйте request.files["image"]
или request.files['file']
вместо request.files.get("image")
для лучшей реализации отметьте Загрузить изображение во Flask
Я попробовал это, хотя это работает, теперь я получаю 400 Bad request
, я отредактировал пост и добавил больше подробностей о сервере.
fd.append('file', $('#image_selector')[0].files[0])
Здесь изменение «файла» на «изображение» решило проблему. Я не знал, что имена действительно имеют значение в этом случае.
fd.append('image', $('#image_selector')[0].files[0])
Вы пытались проверить объект запроса? Например
request.files['file']
?