当前位置: 首页 > 面试题库 >

使用WebApi,Ajax上传文件

卜高超
2023-03-14
问题内容

我想通过ajax调用使用WebApi上传文件,该文件将保存到数据库中。我尝试了此链接中 给出的代码
。在这里,它将接收到的数据作为未指定扩展名的文件保存到硬盘驱动器中,但是我想要执行类似将文件保存到数据库时的操作,我也想保存文件名和扩展名原因,如果以后需要要下载文件,我可以提供文件名和扩展名。并在链接中将文件作为文件保存到硬盘,但是有什么方法可以直接将文件保存到DB。


问题答案:

答案分为几个部分。

首先,要上传文件,可以使用包含以下代码的视图:

@using (Html.BeginForm())
{
    <input type="file" value="Choose a file"/>
    <br/>
    <input type="button" value="Upload" id="upload"/>
}

@section scripts
{
<script type="text/javascript">
    $(document).ready(function() {
        $('#upload').click(function () {
            var data = new FormData();
            var file = $('form input[type=file]')[0].files[0];
            data.append('file',file);
            $.ajax({
                url: '/Api/File/Upload',
                processData: false,
                contentType: false,
                data: data,
                type: 'POST'
            }).done(function(result) {
                alert(result);
            }).fail(function(a, b, c) {
                console.log(a, b, c);
            });
        });
    });
</script>    
}

其次,要接收此数据,请使用以下方法创建一个控制器:

public class FileController : ApiController
{
    [HttpPost]
    public async Task<string> Upload()
    {
       var provider = new MultipartMemoryStreamProvider();
       await Request.Content.ReadAsMultipartAsync(provider);

       // extract file name and file contents
       var fileNameParam = provider.Contents[0].Headers.ContentDisposition.Parameters
           .FirstOrDefault(p => p.Name.ToLower() == "filename");
       string fileName = (fileNameParam == null) ? "" : fileNameParam.Value.Trim('"');
       byte[] file = await provider.Contents[0].ReadAsByteArrayAsync();

       // Here you can use EF with an entity with a byte[] property, or
       // an stored procedure with a varbinary parameter to insert the
       // data into the DB

       var result 
           = string.Format("Received '{0}' with length: {1}", fileName, file.Length);
       return result;
    }
}

第三,默认情况下,最大上传大小是有限的。您可以通过修改克服这些限制web.config

  1. 添加maxRequestLength="max size in bytes"<configuration><system.web><httpRuntime>。(或创建该元素(如果不存在):

  2. 添加maxAllowedContentLength<configuration><system.web><security><requestFiltering><requestLimits>元素(如果不存在则创建此元素)

这些条目如下所示:

<configuration>
  <system.web>
    <!-- kilobytes -->
    <httpRuntime targetFramework="4.5" maxRequestLength="2000000" />

<configuration>
  <system.webServer>
   <security>
    <requestFiltering>
      <!-- bytes -->
      <requestLimits maxAllowedContentLength="2000000000"/>

注意:您应该将此<location>元素包含在元素中,以便将此限制仅应用于文件上传的特定路径,如下所示:

<location path="Api/File/Upload">
  <system.web>
     ...
  <system.webServer>
     ...

注意修改根目录web.config,而不要修改Views文件夹中的根目录。

第四,关于将数据保存在数据库中,如果使用EF,则只需要一个像这样的实体:

public class File
{
  public int FileId { get; set; }
  public string FileName { get; set; }
  public byte[] FileContent { get; set; }
}

创建此类的新对象,添加到上下文中并保存更改。

如果使用存储过程,请创建一个具有varbinary参数的过程,然后传递byte[] fileas值。



 类似资料:
  • 问题内容: 嗨,我正在尝试使用此代码发送带有xmlhttprequest的文件。 但我收到此错误:请求被拒绝,因为未找到多部分边界,请帮助我。 问题答案: 没有这样的事情; 文件对象不应该以这种方式附加。 不发送文件。您必须使用对象将文件包装到post数据对象中: formData.append(“thefile”, file); xhr.send(formData); 之后,可以访问文件(如果您

  • 问题内容: 我知道有很多类似的问题,但是我仍然没有找到解决问题的方法。我正在尝试使用XMLHttpRequest上传文件,因此我开发了以下代码: PHP端脚本是: 但是var $ _FILES [‘file’]似乎为空,这意味着该文件未发送到服务器。然后,我决定在下面的代码中使用FormData对象 它可以正常工作,但文件大小只有8mb左右。当我尝试发送大小超过8mb的文件时,该var 再次变空

  • 问题内容: 我已经进行了很多搜索,以了解如何使用Ajax从表单上载文件,并发现xhr2应该可以做到。但是,我已经尝试过使用FormData对象,但它不起作用。 这是一个简单的html表单 这是“ post.php”文件,当以“老式”方式运行时,它可以正常工作: 这是“ upload.js” 您知道为什么它不起作用吗?控制台返回“未发送文件”。 非常感谢 ! 问题答案: 尝试替换代码: 有了这个:

  • 问题内容: 我正在创建用于发送邮件的邮件页面。我需要在发送前附加一些文件。我如何使用AJAX做到这一点?最初,我需要将这些文件存储在服务器中,然后必须发送邮件。通过单个发送按钮即可完成这些操作。 问题答案: 检查以下问题: JavaScript文件上传 如何为我的Web应用程序上传类似Gmail的文件? 什么是最好的多文件JavaScript / Flash文件上传器?

  • 本文向大家介绍ajax使用formdata上传文件流,包括了ajax使用formdata上传文件流的使用技巧和注意事项,需要的朋友参考一下 今天在做项目的时候涉及到了ajax上传文件流的问题,由于是移动端两个页面的两个表单使用同一个ajax地址进行上传数据给后台,数据中涉及到了不同类型的input,其中存在了file类型的input,导致无法使用表单序列化直接传输数据。 只存在传递一般的参数时,可

  • 从今天起,我尝试通过ajax将文件上传到我的应用程序中。这是我的控制器: html代码中的表单: 在dispacher-servlet.xml中添加了bean。当jquery发送ajax post请求时,得到内部错误(500),我的堆栈如下所示: 我尝试将@RequestParam注释更改为 上载的文件是我自己的类,具有getter和setter,但是,我在中获取NullPointerExcepo