【问题标题】:ASP.net - Uploading Files Associated with a Database Record?ASP.net - 上传与数据库记录相关的文件?
【发布时间】:2015-05-20 15:47:47
【问题描述】:

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

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

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

再说一次,我不是在问如何上传文件。我在问如何将上传的文件与现有记录以及其中涉及的 API 调用相关联。此外,当用户还输入有关他们上传的内容的信息时,我还询问了哪些 API 调用以在用户体验中进行 WHEN。

【问题讨论】:

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


    【解决方案1】:

    我假设您正在使用 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/

    并对其进行了调整以适应我返回的表单数据的需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-06
      • 2011-06-30
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 2014-12-07
      • 2015-12-04
      • 1970-01-01
      相关资源
      最近更新 更多