我有一个ASP .Net(3.5)网站。我有以下代码将文件作为二进制文件上传到SQL数据库:
Print("
protected void UploadButton_Click(object sender, EventArgs e)
{
//Get the posted file
Stream fileDataStream = FileUpload.PostedFile.InputStream;
//Get length of file
int fileLength = FileUpload.PostedFile.ContentLength;
//Create a byte array with file length
byte[] fileData = new byte[fileLength];
//Read the stream into the byte array
fileDataStream.Read(fileData, 0, fileLength);
//get the file type
string fileType = FileUpload.PostedFile.ContentType;
//Open Connection
WebSysDataContext db = new WebSysDataContext(Contexts.WEBSYS_CONN());
//Create New Record
BinaryStore NewFile = new BinaryStore();
NewFile.BinaryID = "1";
NewFile.Type = fileType;
NewFile.BinaryFile = fileData;
//Save Record
db.BinaryStores.InsertOnSubmit(NewFile);
try
{
db.SubmitChanges();
}
catch (Exception)
{
throw;
}
}");
将上传的文件是PDF,您能否帮我编写代码以将PDF从SQL数据库中取出并在浏览器中显示。 (我能够使用linq查询获取二进制文件,但不知道如何处理字节)
答案 0 :(得分:1)
那么你真的只是在如何在ASP.NET中提供字节数组吗?这听起来像数据库部分是无关紧要的,因为您已经说过能够使用LINQ查询获取二进制文件。
如果是,请查看HttpResponse.BinaryWrite。您还应该适当地设置响应的内容类型,例如应用/ PDF。
答案 1 :(得分:0)
文件有多大?巨大的缓冲区(即byte [fileLength])通常是个坏主意。
就个人而言,我会查看this和this之类的内容,它们将读取/写入数据显示为流(第二个显示将流推送为http响应)。但更新为使用varchar(max);-p
答案 2 :(得分:0)
protected void Test_Click(object sender,EventArgs e) {
WebSysDataContext db = new WebSysDataContext(Contexts.WEBSYS_CONN());
var GetFile = from x in db.BinaryStores
where x.BinaryID == "1"
select x.BinaryFile;
FileStream MyFileStream;
long FileSize;
MyFileStream = new FileStream(GetFile, FileMode.Open);
FileSize = MyFileStream.Length;
byte[] Buffer = new byte[(int)FileSize];
MyFileStream.Read(Buffer, 0, (int)FileSize);
MyFileStream.Close();
Response.Write("<b>File Contents: </b>");
Response.BinaryWrite(Buffer);
}
我尝试了这个并没有用。我在这行“MyFileStream = new FileStream(GetFile,FileMode.Open);”中遇到编译错误。 我不知道我哪里出错了,是不是因为我存储它的方式?
答案 3 :(得分:0)
在SQL Server中存储二进制文件时,它会向二进制数据添加OLE标头。因此,在将byte []实际读入文件之前,必须先删除该标题。这是你如何做到的。
// First Strip-Out the OLE header
const int OleHeaderLength = 78;
int strippedDataLength = datarow["Field"].Length - OleHeaderLength;
byte[] strippedData = new byte[strippedDataLength];
Array.Copy(datarow["Field"], OleHeaderLength,
strippedData , 0, strippedDataLength );
运行此代码后,strippedData将包含实际的文件数据。然后,您可以使用MemoryStream或FileStream在byte []上执行I / O.
希望这会有所帮助..
Ruchit S。