我知道在ASP.net中有大量的多部分表单数据上传示例。但是,所有这些只是将文件上载到服务器,并使用System.IO将其写入服务器磁盘空间。此外,客户端实现似乎只在上传时处理文件,因此我无法真正使用现有的上传插件。
如果我有现有记录并且我想上传图像并将其与记录关联怎么办?我是否需要在上传(Api)函数中编写数据库访问代码,如果是,我如何通过上传请求传递该记录的PK?我是否上传了一个请求中的文件,获取服务器生成的文件名,然后进行单独的API调用以将文件与记录关联起来?
虽然有人知道YouTube上传的工作原理吗?从用户的角度来看,我们似乎可以上传视频,在上传时,我们可以设置标题,描述,标签等,甚至可以保存记录。是在API请求上传之前立即创建的视频记录,这就是为什么我们可以在上传完成之前保存信息?
同样,我不是要求如何上传文件。我问如何将上传的文件与现有记录以及其中涉及的API调用相关联。此外,当我们输入有关他们上传内容的信息时,我要求在用户体验中提出什么样的API调用。
答案 0 :(得分:0)
我假设您正在使用api调用来获取用于显示文件列表或单个文件的初始数据。您必须执行此操作才能将ID传递回PUT方法以更新文件。
以下是GET方法的示例:
[HttpGet]
public IEnumerable<FileMetaData> Get()
{
var allFiles = MyEntities.Files.Select(f => new FileMetaData()
{
Name = f.Name,
FileName = f.FileName,
Description = f.Description,
FileId = f.Id,
ContentType = f.ContentType,
Tags = f.Tags,
NumberOfKB = f.NumberOfKB
});
return allFiles;
}
这是POST方法的一个示例,您可以将其改为PUT(更新):
[HttpPost]
[ValidateMimeMultipartContentFilter]
public async Task<IHttpActionResult> PutFile()
{
try
{
var streamProvider =
await Request.Content.ReadAsMultipartAsync(new InMemoryMultipartFormDataStreamProvider());
//We only allow one file
var thisFile = files[0];
//For a PUT version, you would grab the file from the database based on the id included in the form data, instead of creating a new file
var file = new File()
{
FileName = thisFile.FileName,
ContentType = thisFile.ContentType,
NumberOfKB = thisFile.ContentLength
};
//This is the file metadata that your client would pass in as formData on the PUT / POST.
var formData = streamProvider.FormData;
if (formData != null && formData.Count > 0)
{
file.Id = formData["id"];
file.Description = formData["description"];
file.Name = formData["name"] ?? string.Empty;
file.Tags = formData["tags"];
}
file.Resource = thisFile.Data;
//For your PUT, change this to an update.
MyEntities.Entry(file).State = EntityState.Detached;
MyEntities.Files.Add(file);
await MyEntities.SaveChangesAsync();
//return the ID
return Ok(file.Id.ToString());
}
我从本文获得了InMemoryMultipartFormDataStreamProvider: https://conficient.wordpress.com/2013/07/22/async-file-uploads-with-mvc-webapi-and-bootstrap/
并根据我对返回的表单数据的需求进行调整。