Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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
C# Http MultipartFormDataContent_C#_Post_Httpclient_Filestream_Multipartform Data - Fatal编程技术网

C# Http MultipartFormDataContent

C# Http MultipartFormDataContent,c#,post,httpclient,filestream,multipartform-data,C#,Post,Httpclient,Filestream,Multipartform Data,我被要求在C#中做以下工作: 我写了一些没有错误的代码,但是文件没有附加 有人能看看我的C代码,看看我是否写错了代码吗 这是我的密码: var client = new HttpClient(); const string weblinkUrl = "http://testserver.com/attach?"; var method = new MultipartFormDataContent(); const string fileName = "C:\file.txt"; var stre

我被要求在C#中做以下工作:

我写了一些没有错误的代码,但是文件没有附加

有人能看看我的C代码,看看我是否写错了代码吗

这是我的密码:

var client = new HttpClient();
const string weblinkUrl = "http://testserver.com/attach?";
var method = new MultipartFormDataContent();
const string fileName = "C:\file.txt";
var streamContent = new StreamContent(File.Open(fileName, FileMode.Open));
method.Add(streamContent, "filename");

var result = client.PostAsync(weblinkUrl, method);
MessageBox.Show(result.Result.ToString());

我知道这是一篇老文章,但对于那些寻找解决方案的人来说,为了提供更直接的答案,我发现如下:

using System.Diagnostics;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;

public class UploadController : ApiController
{
    public async Task<HttpResponseMessage> PostFormData()
    {
        // Check if the request contains multipart/form-data.
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

        string root = HttpContext.Current.Server.MapPath("~/App_Data");
        var provider = new MultipartFormDataStreamProvider(root);

        try
        {
            // Read the form data.
            await Request.Content.ReadAsMultipartAsync(provider);

            // This illustrates how to get the file names.
            foreach (MultipartFileData file in provider.FileData)
            {
                Trace.WriteLine(file.Headers.ContentDisposition.FileName);
                Trace.WriteLine("Server file path: " + file.LocalFileName);
            }

            return Request.CreateResponse(HttpStatusCode.OK);
        }
        catch (System.Exception e)
        {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
        }
    }
}
使用系统诊断;
Net系统;
使用System.Net.Http;
使用System.Threading.Tasks;
使用System.Web;
使用System.Web.Http;
公共类上载控制器:ApiController
{
公共异步任务PostFormData()
{
//检查请求是否包含多部分/表单数据。
如果(!Request.Content.IsMimeMultipartContent())
{
抛出新的HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root=HttpContext.Current.Server.MapPath(“~/App_Data”);
var provider=新的MultipartFormDataStreamProvider(根);
尝试
{
//读取表单数据。
wait Request.Content.ReadAsMultipartAsync(提供程序);
//这说明了如何获取文件名。
foreach(provider.FileData中的MultipartFileData文件)
{
Trace.WriteLine(file.Headers.ContentDisposition.FileName);
Trace.WriteLine(“服务器文件路径:“+file.LocalFileName”);
}
返回Request.CreateResponse(HttpStatusCode.OK);
}
捕获(System.e例外)
{
返回请求.CreateErrorResponse(HttpStatusCode.InternalServerError,e);
}
}
}
这是我找到它的地方:

为了更详细地实施:

我调试了这个,问题在这里:

method.Add(streamContent, "filename");

这个“添加”实际上并没有将文件放入多部分内容的主体中。

用C#发布多部分表单数据内容很简单,但第一次可能会让人困惑。 下面是我在发布.png.txt等文件时使用的代码

//2。创建url
字符串url=”https://myurl.com/api/...";
字符串filename=“myFile.png”;
//在我的例子中,这是将从post返回的JSON
字符串结果=”;
// 1. 创建MultipartPostMethod
//“NKdKd9Yk”是边界参数
使用(var formContent=new MultipartFormDataContent(“NKdKd9Yk”))
{
formContent.Headers.ContentType.MediaType=“多部分/表单数据”;
//3.添加文件名C:\\…+文件名是文件的路径
Stream fileStream=System.IO.File.OpenRead(“C:\\Users\\username\\Pictures\\”+文件名);
添加(新的StreamContent(fileStream)、文件名、文件名);
使用(var client=new HttpClient())
{
//承载令牌头(如果需要)
client.DefaultRequestHeaders.Add(“授权”、“承载人”+_bearerToken);
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“多部分/表单数据”);
尝试
{
//4.执行MultipartPostMethod
var message=wait client.PostAsync(url、formContent);
//5.a收到答复
结果=wait message.Content.ReadAsStringAsync();
}
捕获(例外情况除外)
{
//如果失败了,你想怎么做就怎么做。
掷骰子;
}
}    
}
//5.b处理从返回的JSON获取可用对象的响应
MyObject MyObject=JsonConvert.DeserializeObject(结果);

在我的例子中,我需要在对象发布后对其执行一些操作,因此我使用JsonConvert将其转换为该对象。

这会读取多部分/表单数据,而不会发送它。我想知道你是否读过这个问题,它甚至不涉及ASP.NET Web API。这是服务器端代码。OP要求提供发送请求的客户端代码。@SOusedtobegood我知道此注释很旧,但我已经有一段时间没有登录了。嗯,问题是C#所以暗示了.NET,代码不是来自ASP,而是来自我正在从事的一个MVC项目。O_o@MostafaZeinali老兄,你什么时候见过C#client side?在发表评论之前,你必须仔细阅读问题。这个问题清楚地表明“有人能看看我的C代码,看看我是否写错了代码吗?”。o_O@iuppiter我见过很多次客户,我的朋友。任何希望向服务器发送/接收数据的客户端C#应用程序都需要编写客户端代码。在作者的问题中,我又看到了一次:“client.PostAsync(weblinkUrl,method);”这是一个客户端代码,试图向服务器发送post请求。简单明了。另一方面,您的代码是服务器端代码,它接收多部分post请求并从中“读取”附加文件。你和作者可以一起创建一个web应用,你做服务器端,他做客户端。这已经被问了很多次了。这里有一些可能的解决方案:C#HttpClient 4.5多部分/表单数据上传:HttpClient多部分表单在C#中发布:在个人便笺上,检查请求中发送的Post数据,并检查响应。这方面很好。什么是
内容
?与
formContent
?@dube是的,当我写答案时,我滑了一下,把内容而不是formContent放进去了。我纠正了它。谢谢你指出这一点
method.Add(streamContent, "filename");