2010-03-15 4 views
0

다양한 파일 (pdf, 이미지 등)은 MS SQL Server의 ntext 필드에 저장됩니다. 물음표와 정의되지 않은 문자를 표시하는 것 외에이 필드에 어떤 유형이 있는지 확실하지 않습니다. 이진 유형이라고 가정합니다.asp를 사용하여 SQL Server의 ntext 데이터를 파일 디렉토리에 저장

스크립트는 행을 반복하고 이러한 파일을 추출하여 임시 디렉토리에 저장합니다. "filename"과 "contenttype"이 주어지고 "data"는 ntext 필드에있는 모든 것입니다.

내가 시도 몇 가지 솔루션 :

1) data.SaveToFile "/temp/"&filename, 2 

오류 : 필요한 개체 : '????????????????????'

???

2) File.WriteAllBytes "/temp/"&filename, data 

오류 : 필요한 개체 : '파일'

나는이 문제를 가져하는 방법을 모르고, 또는 MapPath를위한 서버가 없습니다. (큐 : 어떤 멍청한 놈!)

3) 
Const adTypeBinary = 1 
Const adSaveCreateOverWrite = 2 

Dim BinaryStream 
Set BinaryStream = CreateObject("ADODB.Stream") 
BinaryStream.Type = adTypeBinary 
BinaryStream.Open 
BinaryStream.Write data 
BinaryStream.SaveToFile "C:\temp\" & filename, adSaveCreateOverWrite 

오류 : 인수가 잘못된 형식의 허용 범위를 벗어나 있거나 서로 충돌하고 있습니다.

4) 
Response.ContentType = contenttype 
Response.AddHeader "content-disposition","attachment;" & filename 
Response.BinaryWrite data 
response.end 

이 방법은 작동하지만 저장 대화 상자를 표시하는 대신 파일을 서버에 저장해야합니다. 파일에 대한 응답을 저장하는 방법이 있는지 확실하지 않습니다.

이러한 문제에 대해 알려 주셔서 감사합니다.

+0

NTEXT는 실제로 텍스트 전용입니다.하지만 거기에 바이너리 파일이있는 것 같습니다. 아주 이상한 설정입니다! –

답변

0

열이 NTEXT이므로 모든 SqlClient 개체가 유니 코드 문자열로 해석하므로 모든 종류의 문제가 발생합니다. 열을 varbinary (max)로 변경해야합니다. 당신이 파일에 대한 적절한 진정한 바이너리로 열을 일단

, 당신이하는 SqlClient에서 열 스트림을 읽고 응답에 스트림 (중간 임시 파일을 건너 뛰는)을 작성할 수 있습니다

void StreamFileToResponse(int id, SqlConnection connection) { 
SqlCommand cmd = new SqlCommand(@"select data from table where id = @id", connection); 
cmd.Paramaters.AddWithValue("@id", id); 
using(SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess) { 
    while (rdr.Read()) { 
     Stream data = rdr.GetSqlBytes(0).Stream; 
     byte[] buffer = new byte[4096]; 
     while(int read = data.Read(buffer, 0, 4096)) { 
     Response.BinaryWrite(buffer, 0, read); 
     } 
    } 
} 

ExecuteReader에 전달 된 SequentialAcccess 플래그는 중요합니다. 그렇지 않으면 판독기가 메모리의 전체 파일을 먼저 읽습니다.

관련 문제