gpt4 book ai didi

c# - Flask 服务器 - C# 客户端 - 发布图片

转载 作者:行者123 更新时间:2023-12-01 02:03:44 24 4
gpt4 key购买 nike

我正在构建一个非常简单的应用程序,使用 Flask 作为服务器,C# 作为客户端。服务器通过 HTTP POST 请求接收图像并对其进行处理。我的服务器似乎工作正常,因为我使用 Postman 和 python 客户端对其进行了测试。但是,从我的 C# 客户端附加图像的 POST 请求无法传递到服务器。我已经使用 HttpClient 和 Restsharp 进行了测试,但没有任何效果,服务器提示没有附加图像。

这是我的服务器代码:

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);
}

关于c# - Flask 服务器 - C# 客户端 - 发布图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49276099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com