我想通过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
:
添加maxRequestLength="max size in bytes"
在<configuration><system.web><httpRuntime>
。(或创建该元素(如果不存在):
添加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[] file
as值。
问题内容: 嗨,我正在尝试使用此代码发送带有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