5. ASP.NET 2.0 데이터 소스 제어 코드를 사용하여 이미지를 업로드하고 이진 데이터를 저장합니다.
ADO.NET 메서드는 ASP.NET 2.0 응용 프로그램의 컨텍스트에서 작동하지만 ASP.NET 2.0 데이터 소스 제어를 사용하여 이진 데이터를 저장할 수도 있습니다.
데이터.이진 데이터는 데이터베이스에 저장되므로 ADO.NET 코드를 작성할 필요가 없습니다. 이 데모 프로그램에 사용된 SqlDataSource 컨트롤에는 Title, MIMEType 및 ImageData 값에 해당하는 InsertCommand 및 매개 변수가 포함되어 있습니다.
<asp:SqlDataSource ID="UploadPictureDataSource" runat="서버"
연결문자열="..."
InsertCommand="[그림]에 삽입([제목], [MIMEType], [ImageData]) VALUES (@Title, @MIMEType, @ImageData)">
<InsertParameters>
<asp:매개변수 이름="제목" 유형="문자열" />
<asp:매개변수 이름="MIMEType" 유형="문자열" />
<asp:매개변수 이름="ImageData" />
<//매개변수 삽입>
</asp:SqlDataSource>
여기서 ImageData 매개변수는 유형을 지정하지 않습니다. GUI 마법사를 사용하여 SqlDataSource 구문을 작성하려고 하면 Type="Object"가 지정될 것입니다. 그러나 이 Type="Object"는 sql_variant 유형의 매개 변수를 생성합니다. 그러나 sql_variant의 기본 데이터 크기는 8,000바이트를 초과할 수 없으므로 sql_variants 형식을 사용하여 이미지 또는 varbinary(MAX) 데이터 형식을 저장할 수 없습니다. (Type="Object"를 사용하고 크기가 8,000바이트를 초과하는 이진 데이터를 저장하려고 하면 시스템에서 " '@ImageData' 매개 변수가 sql_variant 데이터 유형의 크기 제한을 초과합니다"라는 메시지와 함께 예외가 발생합니다. 크기가 8,000바이트 미만인 이진 데이터를 추가하려고 하면 "sql_variant 데이터 유형에서 varbinary(max)로의 암시적 변환은 허용되지 않습니다."라는 메시지가 예외로 표시됩니다.
또한 DetailsView 컨트롤에는 두 개의 TemplateField가 포함되어 있습니다. 그 중 TextBox 컨트롤은 한 TemplateField에서 제목 표시줄을 표시하는 데 사용되며 다른 컨트롤은 FileUpload 컨트롤을 사용하여 ImageData 막대를 나타냅니다. 최종 결과는 "ADO.NET 코드를 사용하여 이미지 업로드 및 이진 데이터 저장" 섹션의 것과 유사한 사용자 인터페이스입니다. DetailsView의 "삽입" 버튼을 클릭하면 해당 삽입 이벤트가 시작됩니다. 이때 바이너리 데이터는 FileUpload 컨트롤에서 가져와서 바이트 배열로 읽어온 다음 적절한 매개 변수에 할당해야 합니다.
Protected Sub UploadPictureUI_ItemInserting(ByVal) 보낸 사람은 개체로, ByVal은 System.Web.UI.WebControls.DetailsViewInsertEventArgs로) UploadPictureUI.ItemInserting을 처리합니다.
'FileUpload 컨트롤 Dim UploadedFile As FileUpload = CType(UploadPictureUI.FindControl("UploadedFile"), FileUpload)
'파일이 성공적으로 업로드되었는지 확인하십시오.If UploadedFile.PostedFile Is Nothing OrElse String.IsNullOrEmpty(UploadedFile.PostedFile.FileName) OrElse UploadedFile .PostedFile .InputStream은 아무것도 아닙니다.
...오류 메시지 표시...
e.취소 = True
하위 종료
End If
'JPG 또는 GIF 파일을 다루고 있는지 확인하세요.
Dim 확장 As String = Path.GetExtension(UploadedFile.PostedFile.FileName).ToLower()
Dim MIMEType As String = 없음
선택 케이스 확장
케이스 ".gif"
MIMEType = "이미지/gif"
케이스 ".jpg", ".jpeg", ".jpe"
MIMEType = "이미지/jpeg"
사례 ".png"
MIMEType = "이미지/png"
그렇지 않은 경우
'잘못된 파일 형식 업로드... 오류 메시지 표시...
e.취소 = True
하위 종료
End Select
"MIMEType 및 ImageData 매개변수의 값을 지정합니다.
e.Values("MIMEType") = MIMEType
'FileUpload의 InputStream을 바이트 배열에 로드합니다.
Dim imageBytes(UploadedFile.PostedFile.InputStream.Length)를 바이트로 표시
UploadedFile.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length)
e.Values("ImageData") = imageBytes
End Sub
이전 "삽입" 버튼의 Click 이벤트 핸들러와 마찬가지로 DetailsView의 삽입 이벤트 핸들러도 동일한 논리를 수행합니다. 약간의 구문 차이만 있습니다. 첫째, FileUpload 컨트롤은 템플릿 내에 있으므로 FindControl("controlID") 메서드를 사용하여 프로그래밍 방식으로 참조해야 합니다. 참조된 후에는 파일이 성공적으로 업로드되었는지, 적절한 확장명이 허용되었는지 확인하기 위해 동일한 검사가 수행됩니다. DetailsView의 Inserting 이벤트 핸들러와 약간의 차이점은 오류가 발생하면 해당 삽입 작업을 중지하도록 DetailsView에 알려야 한다는 것입니다. 이는 e.Cancel 속성을 True로 설정하여 달성됩니다.
확인한 후 e.Values("parameterName")=value 구문을 사용하여 MIMEType 및 ImageData 매개변수가 할당됩니다. 이전 ADO.NET 예제와 마찬가지로 먼저 이진 데이터를 바이트 배열로 읽은 다음 바이트 배열을 매개 변수에 할당합니다.
6. 이진 콘텐츠 표시
데이터베이스에 데이터를 저장하는 데 사용하는 기술에 관계없이 이진 데이터를 검색하고 표시하려면 새 ASP.NET 페이지를 만들어야 합니다. ShowPicture.aspx라는 페이지는 쿼리 문자열을 통해 PictureID를 페이지에 전달하고 지정된 제품의 ImageData 필드에서 이진 데이터를 반환합니다. 완료되면 /ShowPicture.aspx?PictureID=picutreID 주소를 방문하여 특정 사진을 볼 수 있습니다. 따라서 웹 페이지에 이미지를 표시하려면 이미지 컨트롤을 사용하고 해당 ImageUrl 속성을 적절한 URL로 설정할 수 있습니다.
ShowPicture.aspx의 .aspx 페이지에는 HTML 태그가 포함되어 있지 않습니다. 코드 숨김 클래스의 Page_Load 이벤트 처리기에서 ADO.NET 코드는 데이터베이스에서 지정된 그림 행의 MIMEType 및 ImageData를 검색하는 데 사용됩니다. 그런 다음 페이지의 ContentType이 MIMEType 필드의 값으로 설정되고 Response.BinaryWrite(ImageData):
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me를 사용하여 바이너리 데이터가 출력됩니다. 짐
Dim PictureID As Integer = Convert.ToInt32(Request.QueryString("PictureID"))
'데이터베이스에 연결하고 지정된 그림의 이미지 내용과 MIME 유형을 반환합니다. myConnection을 New SqlConnection(ConfigurationManager.ConnectionStrings("ImageGalleryConnectionString")으로 사용합니다. ConnectionString)
Const SQL As String = "SELECT [MIMEType], [ImageData] FROM [Pictures] WHERE [PictureID] = @PictureID"
myCommand를 새 SqlCommand(SQL, myConnection)로 사용
myCommand.Parameters.AddWithValue("@PictureID", PictureID)
myConnection.Open()
Dim myReader As SqlDataReader = myCommand.ExecuteReader
If myReader.Read Then
Response.ContentType = myReader("MIMEType").ToString()
Response.BinaryWrite(myReader("ImageData"))
myReader.Close()
인 경우 종료
myConnection.Close()
사용 종료
서브 끝