如何 POST 在 WebAPI 中附加文件的对象?

How to POST an object with a file attached in WebAPI?

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

这是 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 中的 class:

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 与文件一起发送?

感谢您的帮助。

在这些情况下,您可以做的是将保存文件的地址保存在对象的 属性 中。因此,例如,您可以像这样向 class 添加 属性:

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

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