Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flask服务器-C#客户端-Post映像_C#_Python_Flask_Httpclient_Restsharp - Fatal编程技术网

Flask服务器-C#客户端-Post映像

Flask服务器-C#客户端-Post映像,c#,python,flask,httpclient,restsharp,C#,Python,Flask,Httpclient,Restsharp,我正在构建一个非常简单的应用程序,使用Flask作为服务器,C#作为客户端。 服务器通过HTTP POST请求接收图像并对其进行处理。 我的服务器似乎工作正常,因为我用Postman和python客户端对其进行了测试。 但是,无法将从我的C#客户端附加图像的POST请求传递到服务器。我已经用HttpClient和Restsharp进行了测试,但都没有成功,服务器抱怨没有附加图像 以下是我的服务器代码: from flask import Flask, jsonify from flask imp

我正在构建一个非常简单的应用程序,使用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;
    }
public void Upload()
{
字符串path=“path”;
FileInfo fi=新的FileInfo(路径);
字符串fileName=fi.Name;
byte[]fileContents=File.ReadAllBytes(fi.FullName);
Uri webService=新Uri(@“http://127.0.0.1:5000/upload");
HttpRequestMessage requestMessage=新的HttpRequestMessage(HttpMethod.Post,webService);
requestMessage.Headers.ExpectContinue=false;
MultipartFormDataContent multiPartContent=新的MultipartFormDataContent(“----MyGreatBoundary”);
ByteArrayContent ByteArrayContent=新的ByteArrayContent(fileContents);
添加(“内容类型”、“应用程序/八位字节流”);
添加(byteArrayContent,“这是内容的名称”,文件名);
requestMessage.Content=multiPartContent;
HttpClient HttpClient=新HttpClient();
任务httpRequest=httpClient.SendAsync(requestMessage,HttpCompletionOption.ResponseContentRead,CancellationToken.None);
HttpResponseMessage httpResponse=httpRequest.Result;
}

您需要将
name
参数设置为
“file”
,而不是
“这是C代码中内容的名称”

下面是一个简化的方法,可以实现以下目的:

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);
}
public任务上传asformdatacontent(字符串url,字节[]图像)
{
MultipartFormDataContent form=新的MultipartFormDataContent
{
{new ByteArrayContent(image,0,image.Length),“file”,“pic.jpeg”}
};
HttpClient=新的HttpClient();
返回client.PostAsync(url、表单);
}

对于犯同样错误的人,我必须改变
文件的
名称
参数
(正如马吕斯所建议的) 改变
byteArrayContent.Headers.Add(“内容类型”、“应用程序/八位字节流”)
byteArrayContent.Headers.Add(“内容类型”、“多部分/表单数据”)

请修复有问题的缩进。
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);
}