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

时间:2013-05-09 18:54:19

标签: c# sql-server asp.net-mvc sql-server-2008 asp.net-mvc-4

该文件只有14kb(14,000字节)。我已经读过varbinary(max)列类型(我正在使用的)只支持8,000个字节。那是对的吗?如何将文件上传到数据库?

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;
    }
}

错误:

  

字符串或二进制数据将被截断。声明一直如此   终止。

4 个答案:

答案 0 :(得分:5)

在此过程中检查您要插入的其他列。我会特别检查ContentType列,因为它类似于image/jpeg,而不仅仅是图像或jpeg。

以下是list of possible content types,以便您可以相应地在ContentType列中创建足够的空间。

答案 1 :(得分:1)

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。

答案 2 :(得分:1)

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

有关详细信息,请参阅this question

AFAIK VARBINARY(MAX)仅出现在SQL Server 2008中,因此如果您的数据库在该版本之前进行了更新,则可能需要对其进行升级。

答案 3 :(得分:1)

我知道这不是你问题的答案,但是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
    }
}