客户端代码以通过ASP.NET MVC WebApi上传文件 [英] Client code to upload file via ASP.NET MVC WebApi

查看:314
本文介绍了客户端代码以通过ASP.NET MVC WebApi上传文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写代码以将WinForm应用程序的文件上传到WebApi.

I am trying to write code to upload file(s) by WinForm app to WebApi.

WebApi代码类似于:

The WebApi code is like:

[HttpPost]
[Route("UploadEnvelope")]
[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
public Task<HttpResponseMessage> PostUploadEnvelope()
{
    HttpRequestMessage request = this.Request;
    if (!request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }

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

    var task = request.Content.ReadAsMultipartAsync(provider).ContinueWith<HttpResponseMessage>(o =>
        {
            foreach (MultipartFileData fileData in provider.FileData)
            {
                if (string.IsNullOrEmpty(fileData.Headers.ContentDisposition.FileName))
                {
                    return Request.CreateResponse(HttpStatusCode.NotAcceptable, "This request is not properly formatted");
                }
                string fileName = fileData.Headers.ContentDisposition.FileName;
                if (fileName.StartsWith("\"") && fileName.EndsWith("\""))
                {
                    fileName = fileName.Trim('"');
                }
                if (fileName.Contains(@"/") || fileName.Contains(@"\"))
                {
                    fileName = Path.GetFileName(fileName);
                }
                File.Move(fileData.LocalFileName, Path.Combine(root, fileName));
            }

            return new HttpResponseMessage()
            {
                Content = new StringContent("Files uploaded.")
            };
        }
    );
    return task;
}

但是我不确定如何在客户端应用中调用它并传递文件.

But I am not sure how to call it and pass file in a client app.

static string UploadEnvelope(string filePath, string token, string url)
{
    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);


        // How to pass file here ??? 

        var response = client.GetAsync(url + "/api/Envelope/UploadEnvelope").Result;

        return response.Content.ReadAsStringAsync().Result;
    }
}

欢迎任何帮助或建议.预先感谢!

Any help or suggestion is welcome. Thanks in advance!

推荐答案

首先,您使用的是Get方法,该方法用于读取.您必须改为使用Post.

First you are using Get method which is used for reading. You have to use Post instead.

请尝试以下操作:

public static string UploadEnvelope(string  filePath,string token, string url)
{
    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
        using (var content = new MultipartFormDataContent("Envelope" + DateTime.Now.ToString(CultureInfo.InvariantCulture)))
        {
            content.Add(new StreamContent(new MemoryStream(File.ReadAllBytes(filePath))), "filename", "filename.ext");
            using (var message = await client.PostAsync(url + "/api/Envelope/UploadEnvelope", content))
            {
                var input = await message.Content.ReadAsStringAsync();
                return "success";
            }
        }
    }
}

注意:对于大文件,您必须在IIS web.config上更改配置.

Note: For a large file you have to change configuration on IIS web.config.

这篇关于客户端代码以通过ASP.NET MVC WebApi上传文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆