将PDF v1.3上传到DB

时间:2009-05-01 20:23:15

标签: c# asp.net pdf mime-types

我有一些C#代码可以将图像和文件上传到数据库中。目前我认为它适用于所有符合mimetypes列表的文档。但它在一些pdf上失败了。

我已经将问题缩小到一些事实,即某些pdf是1.3格式,有些是1.4格式。 1.4工作并正确上传,但1.3不上传,它不会产生任何运行时错误,它只是无法添加。

上传pdf的一些当前代码是

Checks for valid MIME Type
...

byte[] fileData = new byte[uploadFile.ContentLength];
uploadFile.InputStream.Read(fileData, 0, uploadFile.ContentLength);

...
Continues on to Uploads to db.

对于pdf,它正在寻找“application / pdf”作为mime类型。我不认为1.3格式的pdf有另一种类型,但也许我错了。

之前有其他人遇到过这个问题以及有关如何纠正它的任何建议吗?

4 个答案:

答案 0 :(得分:1)

问题可能是您从输入流中读取的方式。

每当处理流时,都应该反复阅读,记下每次迭代的返回值。所以你原来的代码应该是:

byte[] fileData = new byte[uploadFile.ContentLength];
int totalRead = 0;
while (totalRead < fileData.Length)
{
    int read = uploadFile.InputStream.Read(fileData, totalRead,
                                           fileData.Length - totalRead);
    if (read == 0)
    {
        throw new IOException("Input data was truncated");
    }
    totalRead += read;
}

然而,这可能不是问题。我希望这会导致截断数据,而不是完全没有数据。当你说它“无法添加”时你会更具体吗?你投入了多少伐木?实际将数据插入数据库的代码在哪里?你的日志在失败的情况下会显示什么mime类型?

在我看来,额外的日志记录可能会在这里产生巨大的差异......目前要么你不知道哪里出错,要么就是你没告诉我们。记录应该非常清楚。

答案 1 :(得分:0)

我同意Jon Skeet对这个问题的回答。差异可能是因为Adobe在PDF 1.4中添加了一些新的压缩技术,因此您的1.4 PDF可能会比1.3 PDF小得多。因此,循环读取的需要可能仅表示v1.3 PDF。 (但这只是猜测)

答案 2 :(得分:0)

也许它不是pdf的版本。 Adobe没有在1.4中引入线性化pdf吗?

使用“快速网络视图”pdf可立即获得数据,并且在使用标准pdf完成上传之前,数据不可用。如果您在传输完成之前尝试写入数据库,则可能使用线性化的pdf而不是标准的。

无论哪种方式,Jon Skeet都是对的。记录或正确放置的断点将告诉您。

答案 3 :(得分:0)

这似乎只是一个愚蠢的错误。该文件具有.PDF扩展名,与其余文件不同,带有.pdf。愚蠢的帽子让我。一些额外的调试语句就可以了。