C# 以Mime多部分方式上载某些内容

C# 以Mime多部分方式上载某些内容,c#,angularjs,mime-types,C#,Angularjs,Mime Types,我有一个C#控制器,看起来像这样 public class UploadController : ApiController { public async Task<HttpResponseMessage> Post() { // Check if the request contains multipart/form-data. if (!Request.Content.IsMimeMultipartContent())

我有一个C#控制器,看起来像这样

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

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

        try
        {
            StringBuilder sb = new StringBuilder(); // Holds the response body 

            // Read the form data and return an async task. 
            await Request.Content.ReadAsMultipartAsync(provider);

            // This illustrates how to get the form data. 
            foreach (var key in provider.FormData.AllKeys)
            {
                foreach (var val in provider.FormData.GetValues(key))
                {
                    sb.Append(string.Format("{0}: {1}\n", key, val));
                }
            }

            // This illustrates how to get the file names for uploaded files. 
            foreach (var file in provider.FileData)
            {
                FileInfo fileInfo = new FileInfo(file.LocalFileName);
                sb.Append(string.Format("Uploaded file: {0} ({1} bytes)\n", fileInfo.Name, fileInfo.Length));
            }
            return new HttpResponseMessage()
            {
                Content = new StringContent(sb.ToString())
            };
        }
        catch (System.Exception e)
        {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
        }
    }


}
**<form name="form1" method="post" enctype="multipart/form-data" action="api/Upload">
<div>
    <label for="caption">Image Caption</label>
    <input name="caption" type="text" />
</div>
<div>
    <label for="image1">Image File</label>
    <input name="image1" type="file" />
</div>
<div>
    <input ng-click="submit()" type="submit" value="Submit" />
</div>
公共类上载控制器:ApiController
{
公共异步任务Post()
{
//检查请求是否包含多部分/表单数据。
如果(!Request.Content.IsMimeMultipartContent())
{
抛出新的HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root=HttpContext.Current.Server.MapPath(“~/Uploads”);
var provider=新的MultipartFormDataStreamProvider(根);
尝试
{
StringBuilder sb=new StringBuilder();//保存响应正文
//读取表单数据并返回异步任务。
wait Request.Content.ReadAsMultipartAsync(提供程序);
//这说明了如何获取表单数据。
foreach(provider.FormData.AllKeys中的var键)
{
foreach(provider.FormData.GetValues(键)中的var val)
{
sb.Append(string.Format(“{0}:{1}\n”,key,val));
}
}
//这说明了如何获取上载文件的文件名。
foreach(provider.FileData中的var文件)
{
FileInfo FileInfo=newfileinfo(file.LocalFileName);
sb.Append(string.Format(“上传的文件:{0}({1}字节)\n”、fileInfo.Name、fileInfo.Length));
}
返回新的HttpResponseMessage()
{
Content=新的StringContent(sb.ToString())
};
}
捕获(System.e例外)
{
返回请求.CreateErrorResponse(HttpStatusCode.InternalServerError,e);
}
}
}
还有一个Upload.html页面,如下所示

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

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

        try
        {
            StringBuilder sb = new StringBuilder(); // Holds the response body 

            // Read the form data and return an async task. 
            await Request.Content.ReadAsMultipartAsync(provider);

            // This illustrates how to get the form data. 
            foreach (var key in provider.FormData.AllKeys)
            {
                foreach (var val in provider.FormData.GetValues(key))
                {
                    sb.Append(string.Format("{0}: {1}\n", key, val));
                }
            }

            // This illustrates how to get the file names for uploaded files. 
            foreach (var file in provider.FileData)
            {
                FileInfo fileInfo = new FileInfo(file.LocalFileName);
                sb.Append(string.Format("Uploaded file: {0} ({1} bytes)\n", fileInfo.Name, fileInfo.Length));
            }
            return new HttpResponseMessage()
            {
                Content = new StringContent(sb.ToString())
            };
        }
        catch (System.Exception e)
        {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
        }
    }


}
**<form name="form1" method="post" enctype="multipart/form-data" action="api/Upload">
<div>
    <label for="caption">Image Caption</label>
    <input name="caption" type="text" />
</div>
<div>
    <label for="image1">Image File</label>
    <input name="image1" type="file" />
</div>
<div>
    <input ng-click="submit()" type="submit" value="Submit" />
</div>
**
图片说明
图像文件
**

它让我选择一个文件点击上传,并保存到一个本地文件夹。然而,当上传时,这些文件被称为“BodyPart_175b76cb-88f2-4ea4-bbc5-fd3038345e5e”,属于文件类型。我想要我的应用程序做的是上传文件并保留其名称和文件类型。这是正确的做法吗

编辑 所以我发现这些文件实际上正在上传,如果我添加了正确的扩展名,我就能够打开它们。有人知道如何让它在上传后保留文件名吗?

知道了

重载其中一个MIME对象以返回正确的名称

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Http;


namespace AngularFun.Controllers
{
    class MyMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
    {
        public MyMultipartFormDataStreamProvider(string path)
            : base(path)
        {

        }

        public override string GetLocalFileName(System.Net.Http.Headers.HttpContentHeaders headers)
        {
            string fileName;
            if (!string.IsNullOrWhiteSpace(headers.ContentDisposition.FileName))
            {
                fileName = headers.ContentDisposition.FileName;
            }
            else
            {
                fileName = Guid.NewGuid().ToString() + ".data";
            }
            return fileName.Replace("\"", string.Empty);
        }
    }
}

检查服务器上的文件是否有字节。不要认为你可以通过ajax上传文件而不耍花招。