在MVC中上传文件时,字符串或二进制数据将被截断

本文关键字:数据 二进制 字符串 MVC 文件 | 更新日期: 2023-09-27 18:13:06

文件只有14kb(14000字节)。我读到varbinary(max)列类型(这是我正在使用的)只支持8000字节。对吗?我怎样才能把文件上传到数据库?

if (file.ContentLength < (3 * 1048576))
{
    // extract only the fielname
    var fileName = Path.GetFileName(file.FileName);
    using (MemoryStream ms = new MemoryStream())
    {
        file.InputStream.CopyTo(ms);
        byte[] array = ms.GetBuffer();
        adj.resumeFile = array;
        adj.resumeFileContentType = file.ContentType;
    }
}

错误:

字符串或二进制数据将被截断。声明是终止。

在MVC中上传文件时,字符串或二进制数据将被截断

检查在此过程中插入的其他列。我会特别检查ContentType列,因为这将是image/jpeg之类的东西,而不是简单的图像或jpeg。

这里是一个可能的内容类型列表,以便您可以在您的ContentType列中相应地创建足够的空间

varbinary  [ ( n | max) ]  
Variable-length binary data. n can be a value from 1 through 8,000. 

max表示最大存储空间为2^31-1字节。

http://msdn.microsoft.com/en-us/library/ms188362.aspx

就是2GB。

如果在表定义中将列定义为VARBINARY(MAX),那么应该拥有最多2 GB的存储空间。如果您将最大列大小指定为数字,那么您只能显式地请求最多VARBINARY(8000)

详情请参阅此问题

AFAIK VARBINARY(MAX)只出现在SQL Server 2008,所以如果你的数据库早于那个版本,你可能需要升级它。

我知道这不是你问题的答案,但是ms.GetBuffer()将获得底层缓冲区,这可能不是你的数据的确切大小。MemoryStream为写入分配额外的空间,您可能会从未使用的缓冲区中插入额外的字节。这里你可以看到GetBuffer()返回一个256字节的数组,即使文件只有5字节长:

using (MemoryStream ms = new MemoryStream())
{
    using (FileStream fs = File.OpenRead("C:''t''hello.txt"))
    {
        fs.CopyTo(ms);
        byte[] results = ms.GetBuffer();
        Console.WriteLine("Size: {0}", results.Length); // 256
        byte[] justdata = new byte[ms.Length];
        Array.Copy(results, justdata, ms.Length);
        Console.WriteLine("Size: {0}", justdata.Length); // 5
    }
}