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

File upload ASP.net-上载与数据库记录关联的文件?,file-upload,asp.net-web-api,youtube,File Upload,Asp.net Web Api,Youtube,我知道ASP.net中有很多多部分表单数据上传的示例。但是,它们都只是将文件上载到服务器,然后使用System.IO将其写入服务器磁盘空间。此外,客户端实现似乎只在上传时处理文件,所以我不能真正使用现有的上传插件 如果我有一个现有的记录,我想上传图像并将其与记录关联,该怎么办?我是否需要在upload(Api)函数中编写数据库访问代码,如果需要,我如何通过upload请求传递该记录的PK?我是否应该在一个请求中上传文件,获取服务器生成的文件名,然后分别进行API调用以将文件与记录关联 在这里,有

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

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

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


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

我假设您使用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;
    }
[HttpGet]
公共IEnumerable Get()
{
var allFiles=myenties.Files.Select(f=>newfilemetadata()
{
Name=f.Name,
FileName=f.FileName,
描述=f.描述,
FileId=f.Id,
ContentType=f.ContentType,
标签=f.标签,
NumberOfKB=f.NumberOfKB
});
返回所有文件;
}
以下是POST方法的示例,您可以将其改为PUT(更新):

[HttpPost]
[验证EMIMememultipartContentFilter]
公共异步任务PutFile()
{
尝试
{
变量流提供程序=
wait Request.Content.ReadAsMultipartAsync(在MemoryMultipartFormDataStreamProvider()中新增);
//我们只允许一个文件
var thisFile=文件[0];
//对于PUT版本,您可以根据表单数据中包含的id从数据库中获取文件,而不是创建新文件
var file=新文件()
{
FileName=thisFile.FileName,
ContentType=thisFile.ContentType,
NumberOfKB=thisFile.ContentLength
};
//这是您的客户机将在PUT/POST上作为formData传递的文件元数据。
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;
//对于您的PUT,请将此更改为更新。
MyEntities.Entry(file.State=EntityState.Detached;
MyEntities.Files.Add(文件);
等待MyEntities.saveChangesSync();
//返回ID
返回Ok(file.Id.ToString());
}
我从本文中获得了InMemoryMultipartFormDataStreamProvider:

并对其进行了调整,以满足我返回的表单数据的需要

[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());

    }