Flask 服务器 - C# 客户端 - Post 图片
Flask server - C# client - Post image
我正在构建一个非常简单的应用程序,使用 Flask 作为服务器,使用 C# 作为客户端。
服务器通过 HTTP POST 请求接收图像并处理它。
我的服务器似乎工作正常,因为我使用 Postman 和 python 客户端对其进行了测试。
但是,无法将来自我的 C# 客户端的带有图像的 POST 请求传递到服务器。我已经使用 HttpClient 和 Restsharp 进行了测试,但 none 有效,服务器抱怨没有附加图像。
这是我的服务器代码:
from flask import Flask, jsonify
from flask import abort
from flask import make_response
from flask import request, Response
from flask import url_for
from werkzeug.utils import secure_filename
import jsonpickle
import numpy as np
import cv2
import os
import json
import io
app = Flask(__name__)
UPLOAD_FOLDER = os.path.basename('uploads')
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif', 'mp4', '3gp', 'mov'])
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16 MB
@app.route('/upload', methods=['POST'])
def upload():
file = request.files['file']
filename = secure_filename(file.filename)
in_memory_file = io.BytesIO()
file.save(in_memory_file)
data = np.fromstring(in_memory_file.getvalue(), dtype=np.uint8)
color_image_flag = 1
img = cv2.imdecode(data, color_image_flag)
cv2.imwrite("uploads\" + file.filename, img)
这是我使用 Restsharp 的客户端代码
public void Test()
{
var client = new RestClient("http://127.0.0.1:5000/upload");
var request = new RestRequest(Method.POST);
request.AddHeader("content-type", "multipart/form-data; boundary=----Boundary");
request.AddParameter("multipart/form-data; boundary=----Boundary", "------Boundary\r\nContent-Disposition: form-data; name=\"file\"; filename=\"path\"\r\nContent-Type: image/jpeg\r\n\r\n\r\n------Boundary--", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
}
这里是使用 HttpClient 的客户端代码
public void Upload()
{
string path = "path";
FileInfo fi = new FileInfo(path);
string fileName = fi.Name;
byte[] fileContents = File.ReadAllBytes(fi.FullName);
Uri webService = new Uri(@"http://127.0.0.1:5000/upload");
HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Post, webService);
requestMessage.Headers.ExpectContinue = false;
MultipartFormDataContent multiPartContent = new MultipartFormDataContent("----MyGreatBoundary");
ByteArrayContent byteArrayContent = new ByteArrayContent(fileContents);
byteArrayContent.Headers.Add("Content-Type", "application/octet-stream");
multiPartContent.Add(byteArrayContent, "this is the name of the content", fileName);
requestMessage.Content = multiPartContent;
HttpClient httpClient = new HttpClient();
Task<HttpResponseMessage> httpRequest = httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseContentRead, CancellationToken.None);
HttpResponseMessage httpResponse = httpRequest.Result;
}
您需要在 C# 代码中将 name
参数设置为 "file"
而不是 "this is the name of the content"
。
multiPartContent.Add(byteArrayContent, "file", "image.jpg");
这是一个精简的方法,可以解决问题:
public Task<HttpResponseMessage> UploadAsFormDataContent(string url, byte[] image)
{
MultipartFormDataContent form = new MultipartFormDataContent
{
{ new ByteArrayContent(image, 0, image.Length), "file", "pic.jpeg" }
};
HttpClient client = new HttpClient();
return client.PostAsync(url, form);
}
对于犯同样错误的人,我不得不改变
name
file
的论点(正如马吕斯建议的那样)
并改变
byteArrayContent.Headers.Add("Content-Type", "application/octet-stream");
到
byteArrayContent.Headers.Add("Content-Type", "multipart/form-data");
我正在构建一个非常简单的应用程序,使用 Flask 作为服务器,使用 C# 作为客户端。 服务器通过 HTTP POST 请求接收图像并处理它。 我的服务器似乎工作正常,因为我使用 Postman 和 python 客户端对其进行了测试。 但是,无法将来自我的 C# 客户端的带有图像的 POST 请求传递到服务器。我已经使用 HttpClient 和 Restsharp 进行了测试,但 none 有效,服务器抱怨没有附加图像。
这是我的服务器代码:
from flask import Flask, jsonify
from flask import abort
from flask import make_response
from flask import request, Response
from flask import url_for
from werkzeug.utils import secure_filename
import jsonpickle
import numpy as np
import cv2
import os
import json
import io
app = Flask(__name__)
UPLOAD_FOLDER = os.path.basename('uploads')
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif', 'mp4', '3gp', 'mov'])
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16 MB
@app.route('/upload', methods=['POST'])
def upload():
file = request.files['file']
filename = secure_filename(file.filename)
in_memory_file = io.BytesIO()
file.save(in_memory_file)
data = np.fromstring(in_memory_file.getvalue(), dtype=np.uint8)
color_image_flag = 1
img = cv2.imdecode(data, color_image_flag)
cv2.imwrite("uploads\" + file.filename, img)
这是我使用 Restsharp 的客户端代码
public void Test()
{
var client = new RestClient("http://127.0.0.1:5000/upload");
var request = new RestRequest(Method.POST);
request.AddHeader("content-type", "multipart/form-data; boundary=----Boundary");
request.AddParameter("multipart/form-data; boundary=----Boundary", "------Boundary\r\nContent-Disposition: form-data; name=\"file\"; filename=\"path\"\r\nContent-Type: image/jpeg\r\n\r\n\r\n------Boundary--", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
}
这里是使用 HttpClient 的客户端代码
public void Upload()
{
string path = "path";
FileInfo fi = new FileInfo(path);
string fileName = fi.Name;
byte[] fileContents = File.ReadAllBytes(fi.FullName);
Uri webService = new Uri(@"http://127.0.0.1:5000/upload");
HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Post, webService);
requestMessage.Headers.ExpectContinue = false;
MultipartFormDataContent multiPartContent = new MultipartFormDataContent("----MyGreatBoundary");
ByteArrayContent byteArrayContent = new ByteArrayContent(fileContents);
byteArrayContent.Headers.Add("Content-Type", "application/octet-stream");
multiPartContent.Add(byteArrayContent, "this is the name of the content", fileName);
requestMessage.Content = multiPartContent;
HttpClient httpClient = new HttpClient();
Task<HttpResponseMessage> httpRequest = httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseContentRead, CancellationToken.None);
HttpResponseMessage httpResponse = httpRequest.Result;
}
您需要在 C# 代码中将 name
参数设置为 "file"
而不是 "this is the name of the content"
。
multiPartContent.Add(byteArrayContent, "file", "image.jpg");
这是一个精简的方法,可以解决问题:
public Task<HttpResponseMessage> UploadAsFormDataContent(string url, byte[] image)
{
MultipartFormDataContent form = new MultipartFormDataContent
{
{ new ByteArrayContent(image, 0, image.Length), "file", "pic.jpeg" }
};
HttpClient client = new HttpClient();
return client.PostAsync(url, form);
}
对于犯同样错误的人,我不得不改变
name
file
的论点(正如马吕斯建议的那样)
并改变
byteArrayContent.Headers.Add("Content-Type", "application/octet-stream");
到
byteArrayContent.Headers.Add("Content-Type", "multipart/form-data");