如何 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 属性。
我正在使用 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 属性。