ASP.net - 上传与数据库记录关联的文件?

时间:2015-05-20 15:47:48

标签: file-upload asp.net-web-api youtube

我知道在ASP.net中有大量的多部分表单数据上传示例。但是,所有这些只是将文件上载到服务器,并使用System.IO将其写入服务器磁盘空间。此外,客户端实现似乎只在上传时处理文件,因此我无法真正使用现有的上传插件。

如果我有现有记录并且我想上传图像并将其与记录关联怎么办?我是否需要在上传(Api)函数中编写数据库访问代码,如果是,我如何通过上传请求传递该记录的PK?我是否上传了一个请求中的文件,获取服务器生成的文件名,然后进行单独的API调用以将文件与记录关联起来?

虽然有人知道YouTube上传的工作原理吗?从用户的角度来看,我们似乎可以上传视频,在上传时,我们可以设置标题,描述,标签等,甚至可以保存记录。是在API请求上传之前立即创建的视频记录,这就是为什么我们可以在上传完成之前保存信息?

同样,我不是要求如何上传文件。我问如何将上传的文件与现有记录以及其中涉及的API调用相关联。此外,当我们输入有关他们上传内容的信息时,我要求在用户体验中提出什么样的API调用。

1 个答案:

答案 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/

并根据我对返回的表单数据的需求进行调整。