如何使用WebAPI中附加的文件发布对象?

时间:2016-09-27 08:22:59

标签: c# angularjs asp.net-web-api attachment

我正在使用 AngularJS 来构建我的应用程序。在其中,我有一个表单,用户可以填写信息。这将创建一个使用WebAPI POST到数据库的对象。

这是Angular代码:

$scope.test_object =
{
    'Title': $scope.test_object.title,
    'Description': $scope.test_object.description,
};

// POST to the database
$http.post(some_url, JSON.stringify($scope.test_object)).then(function (response) {
        // do something
    }
);

这是我在Visual Studio中的课程:

public class ClassName
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
}

这应该没有任何问题。我的问题是表单具有附加文件的能力。我在Visual Studio中有一个控制器来发送文件,这里是代码:

public class FileUploadController : ApiController
{

    [Route("api/upload")]
    public async Task<HttpResponseMessage> Post()
    {
        try
        {
            if (!Request.Content.IsMimeMultipartContent())
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }

            //Save To this server location
            var uploadPath = HttpContext.Current.Server.MapPath("~/Data");

            //Save file via CustomUploadMultipartFormProvider
            var multipartFormDataStreamProvider = new CustomUploadMultipartFormProvider(uploadPath);

            // Read the MIME multipart asynchronously 
            await Request.Content.ReadAsMultipartAsync(multipartFormDataStreamProvider);

            // Show all the key-value pairs.
            foreach (var key in multipartFormDataStreamProvider.FormData.AllKeys)
            {
                foreach (var val in multipartFormDataStreamProvider.FormData.GetValues(key))
                {
                    Console.WriteLine(string.Format("{0}: {1}", key, val));
                }
            }

            //In Case you want to get the files name
            //string localFileName = multipartFormDataStreamProvider
            //    .FileData.Select(multiPartData => multiPartData.LocalFileName).FirstOrDefault();

            return new HttpResponseMessage(HttpStatusCode.OK);
        }
        catch (Exception e)
        {
            return new HttpResponseMessage(HttpStatusCode.NotImplemented)
            {
                Content = new StringContent(e.Message)
            };
        }
    }
}

我在网上找到了这个代码,它适用于发送文件。这会将任何文件发送到指定的文件夹(/ Data)。

现在我的问题是:如何在对象和附件之间创建关系?如何判断哪些文件与每个对象相关联?我会以某种方式发送对象ID和文件吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在这些情况下您可以执行的操作是保存文件保存在对象属性中的位置。因此,对于实例,您可以像这样在类中添加属性:

public class ClassName
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string FilePath { get; set; }
}

然后当您将文件写入目录时,将文件的地址复制到FilePath属性。