在ASP.NET MVC Web api控制器中上传文件

4
我想创建一个 WEB API,从给定的客户端上传文件到 Azure。为了实现这一点,我知道可以使用像 MultipartFormDataStreamProvider 这样的类(不确定这个类是否适用于 Azure)。
我希望这个 API 可以从各种应用程序中访问。首先是一个简单的 .NET 应用程序。但我的问题是,我能否使用同一个 API 来处理来自 Android 应用程序、Windows 8 应用程序等的文件上传?
如果不可能,那么所有这些应用程序都需要暴露一个单独的 API 吗?
我关于 API 的想法是,它可以在各种应用程序中用于所需的功能。但在这种情况下,上传文件所需的类将限制其使用。
3个回答

3

@nikhil pinto: ASP.NET Web API可以帮助您创建REST Web服务,这些服务可以被支持HTTP请求的任何类型的客户端使用。我在这里找到了这篇文章。

http://hintdesk.com/android-upload-files-to-asp-net-web-api-service

这篇文章非常好,因为它阐述了如何从不同的客户端调用Web服务。去看看吧。


3
请查看以下示例代码,以通过 post 方法向 .Net Web API 发送多个文件。
.Net Web API 方法
   [HttpPost]
    public string SaveImage()
    {
       string uploadedfilelist="";
        if (((IList)HttpContext.Current.Request.Form.AllKeys).Contains("fileModel"))
        {
            var activity = JsonConvert.DeserializeObject<SocialCompanyPost>(HttpContext.Current.Request.Form["fileModel"]);

            var files = HttpContext.Current.Request.Files.Count > 0 ? HttpContext.Current.Request.Files : null;
            if (files != null && files.Count > 0)
            {
                 for (int i = 0; i < files.Count; i++)
                    {
                        if (files[i].ContentLength > 0)
                        {
                            try
                            {
                                var filepath = HttpContext.Current.Server.MapPath("~/Images/ServiceCenters/" + files[i].FileName);//, ms.ToArray());
                                files[i].SaveAs(filepath);
                                uploadedfilelist += files[i].FileName+",";
                            }
                            catch (Exception e)
                            {
                                Console.WriteLine(e);
                                throw;
                            }

                        }
                    }
            }
        }
        return uploadedfilelist;
    } 

客户端MVC应用程序使用POST方法调用Web API POST方法。
    public string UploadImages(ServiceCenterPost socialCompany)
    {
        var url = "api/Images/SaveImage";
        if (socialCompany.ThumbnailUrlFileUpload.Count() > 0)
        {
            var fullURL = ConfigurationManager.AppSettings["ServiceApi"] + url;
            HttpClient client = new HttpClient();
            MultipartFormDataContent form = new MultipartFormDataContent();
            var stringContent = new StringContent(JsonConvert.SerializeObject(new SocialCompanyAdmin { CompanyCode = socialCompany.CompanyCode }));
            stringContent.Headers.Add("Content-Disposition", "form-data; name=\"fileModel\"");
            form.Add(stringContent, "json");
            //loop each files from file upload control
            foreach (var file in socialCompany.ThumbnailUrlFileUpload)
            {
                if (file != null && file.ContentLength > 0)
                {                        
                    var streamContent = new StreamContent(file.InputStream);
                    streamContent.Headers.Add("Content-Type", "application/octet-stream");
                    streamContent.Headers.Add("Content-Disposition", "form-data; name=\"file\"; filename=\"" + Path.GetFileName(file.FileName) + "\"");
                    form.Add(streamContent, "file", Path.GetFileName(file.FileName));
                }
            }
            client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
            client.DefaultRequestHeaders.Add("Accept-Language", Language);
            var response = client.PostAsync(fullURL, form).Result;
            if (response.IsSuccessStatusCode)
            {
                    string modelObject = response.Content.ReadAsStringAsync().Result;
                    return JsonConvert.DeserializeObject<string>(modelObject);

            }              
        }
        return null;
    } 

1

Web API上传图像的代码

[System.Web.Http.AcceptVerbs("POST")]
        public async Task<object> AddAttachment()
        {
            if (!Request.Content.IsMimeMultipartContent("form-data"))
            {
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.UnsupportedMediaType));
            }

            NamedMultipartFormDataStreamProvider streamProvider = new NamedMultipartFormDataStreamProvider(
                HttpContext.Current.Server.MapPath("~/App_Data/"));

            await Request.Content.ReadAsMultipartAsync(streamProvider);
            string path = streamProvider.FileData.Select(entry => entry.LocalFileName).First();
            byte[] imgdata = System.IO.File.ReadAllBytes(path);

            return new
            {
                FileNames = streamProvider.FileData.Select(entry => entry.LocalFileName),

            };
        }

谢谢提供代码。但我已经有这个了。我需要知道当我尝试从Android应用程序上传文件时,它是否有效。 - nikhil pinto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接