我有一些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有另一种类型,但也许我错了。
之前有其他人遇到过这个问题以及有关如何纠正它的任何建议吗?
答案 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。愚蠢的帽子让我。一些额外的调试语句就可以了。