1. 소개
데이터 기반 애플리케이션을 구축할 때 텍스트와 이진 데이터를 캡처해야 하는 경우가 많습니다. 이러한 프로그램은 이미지, PDF, Word 파일 또는 기타 바이너리 데이터를 저장해야 할 수도 있습니다. 이 바이너리 데이터를 저장하는 방법에는 두 가지가 있습니다. 웹 서버의 파일 시스템에 저장하는 방법과 데이터베이스의 해당 파일에 대한 참조를 추가하는 방법, 또는 데이터베이스 자체에 직접 저장하는 방법입니다.
문자열, 숫자, 날짜, GUID, 금전적 가치 등과 같은 텍스트 데이터 - 데이터베이스 시스템에는 적절하고 해당하는 데이터 유형 정의가 있습니다. 예를 들어 Microsoft SQL Server에서는 int 데이터 유형을 사용하여 정수 값을 저장할 수 있고 문자열 값을 저장하려면 varchar 또는 nvarchar 유형을 사용할 수 있습니다. 또한 데이터베이스는 이진 데이터 저장을 위한 유형 정의도 제공합니다. Microsoft SQL SERVER 2000 및 이전 버전에서는 이미지 데이터 형식을 사용하여 이진 데이터를 저장하고, SQL SERVER 2005에서는 varbinary(MAX) 데이터 형식을 사용합니다. 이러한 데이터 유형은 위의 두 가지 방법 중 하나를 사용하여 최대 2GB 크기의 이진 데이터를 저장할 수 있습니다.
그러나 이진 데이터를 데이터베이스에 직접 저장하는 경우 이진 데이터를 삽입, 업데이트 및 검색하는 데 몇 가지 추가 작업이 필요합니다. 다행히도 ADO.NET과 같은 상위 수준 데이터 액세스 라이브러리를 통해 이 복잡한 하위 수준 T-SQL 작업을 추상화할 수 있으므로 문제가 매우 간단해집니다. 그러나 ADO.NET을 통한 이진 데이터 작업은 텍스트 데이터 작업과 약간 다릅니다. 이 기사에서는 ADO.NET 및 ASP.NET 2.0 SqlDataSource 컨트롤을 사용하여 데이터베이스에서 직접 이미지 파일을 저장하고 검색하는 방법을 분석합니다. 계속 읽어주세요!
2. 데이터베이스에 데이터를 저장하는 것과 파일 시스템에 저장하는 것의 비교
방금 소개한 것처럼, 애플리케이션에서 바이너리 데이터를 캡처할 때 바이너리 데이터는 데이터베이스에 직접 저장되거나 서버의 파일로 저장될 수 있습니다. 파일 시스템 - 데이터베이스의 파일에 대한 참조만 유지됩니다. 내 경험에 따르면 대부분의 개발자는 주로 다음과 같은 이유로 바이너리 데이터를 파일 시스템에 저장하는 것을 선호합니다.
· 필요한 노력이 적습니다. - 데이터베이스에 저장된 바이너리를 저장하고 검색하려면 더 많은 코딩 노력이 필요합니다. 또한, 이러한 바이너리 데이터를 업데이트하는 것이 더 쉬울 것입니다. 데이터베이스와 통신할 필요 없이 파일을 직접 수정하기만 하면 됩니다!
· 파일을 가리키는 URL이 더 직접적입니다. - 이 기사에서 볼 수 있듯이 데이터베이스에 저장된 이진 데이터에 대한 액세스를 제공하려면 해당 데이터를 반환할 수 있는 또 다른 ASP.NET 페이지를 만들어야 합니다. 일반적으로 데이터베이스의 해당 레코드(이진 데이터 반환)에 해당하는 고유 식별자가 이 페이지에 전달됩니다. 결과적으로 업로드된 이미지와 같은 이진 데이터에 액세스하기 위한 URL은 http://www.yourserver.com/ShowImage.aspx?ID=4352 와 같게 됩니다. 반면 이미지가 파일에 직접 저장된 경우에는 시스템에서는 URL이 더 직접적입니다(예: http://www.yourserver.com/UploadedImages/Sam.jpg).
· 이미지 표시를 위한 향상된 도구 지원 - ASP.NET 2.0을 사용하는 경우 GridView 또는 DetailsView 컨트롤의 ImageField 컨트롤을 사용하여 이미지를 표시할 수 있습니다(이미지 경로는 데이터베이스에 저장됨). 그러나 안타깝게도 이 ImageField는 데이터베이스의 이미지 데이터를 직접 표시할 수 없습니다(외부 페이지를 쿼리하고 해당 데이터를 반환해야 하기 때문).
· 성능 - 바이너리 파일이 데이터베이스가 아닌 웹 서버의 파일 시스템에 저장되기 때문에 응용 프로그램은 데이터베이스에 있는 더 적은 데이터에 액세스할 수 있으므로 데이터베이스에 대한 요구 사항이 줄어들고 그에 따라 웹 및 네트워크 간의 요구 사항이 줄어듭니다. 데이터베이스 서버.
데이터를 데이터베이스에 직접 저장하는 주요 이점은 데이터를 "자체 포함"으로 만든다는 것입니다. 이제 모든 데이터가 데이터베이스에 포함되어 있으므로 파일 시스템에 저장된 바이너리 콘텐츠를 복사하거나 백업하는 것에 대해 걱정할 필요가 없기 때문에 데이터 지원, 데이터베이스 서버 간 데이터 이동, 데이터베이스 복제 등이 훨씬 쉬워졌습니다.
항상 그렇듯이 어떤 스토리지 솔루션을 선택할지는 실제 사용 현장과 비즈니스 요구 사항에 따라 달라집니다. 예를 들어, 사용 중인 보고 소프트웨어는 데이터베이스에서 가져온 경우 보고서에 바이너리 데이터만 포함할 수 있었기 때문에 바이너리 데이터를 데이터베이스에 저장해야 하는 클라이언트를 개발했습니다. 또 다른 경우에는 내 동료가 바이너리를 웹 애플리케이션에서 사용해야 하고 FTP를 통해 사용할 수 있어야 하는 프로젝트를 진행하고 있었는데, 이 경우 바이너리 데이터를 파일 시스템에 저장해야 했습니다.
3. 이진 데이터를 저장할 데이터베이스 테이블 만들기
이 기사의 나머지 부분에서는 Microsoft SQL Server 2005 Express Edition을 사용하여 작성한 간단한 ASP.NET 2.0 이미지 갤러리 응용 프로그램을 분석하여 이진 데이터를 저장하고 검색하는 것과 관련된 직접적인 개념을 보여줍니다. 데이터 베이스.
이 이미지 갤러리 애플리케이션의 데이터 모델은 각 레코드가 갤러리의 사진에 해당하는 사진 테이블로 구성됩니다. 이 Pictures 테이블의 MIMEType 필드는 업로드된 이미지의 MIME 유형(JPG 파일의 경우 image/jpeg, GIF 파일의 경우 image/gif 등)을 저장합니다. 여기서 MIME 유형은 바이너리 데이터를 생성하는 방법을 브라우저에 지정합니다. ImageData 열은 이미지의 실제 이진 콘텐츠를 저장합니다.
4. ADO.NET 코드를 사용하여 이미지 업로드 및 이진 데이터 저장
이 이미지 갤러리를 사용하면 방문자가 이미지 파일(GIF, JPG 및 PNG 형식)을 이 애플리케이션에 업로드할 수 있습니다. 업로드되면 새 레코드가 Pictures 테이블에 추가되고 이미지 파일의 내용은 새 레코드의 ImageData 열에 저장됩니다. ASP.NET 2.0에서는 웹 브라우저에서 웹 서버로 파일을 업로드하기 위해 이 예제에서는 FileUpload 컨트롤이 사용됩니다. FileUpload 컨트롤을 사용하는 것은 매우 간단합니다. 도구 모음에서 페이지로 드래그하기만 하면 됩니다. 궁극적으로 이 FileUpload 컨트롤은 사용자의 브라우저에서 표준 파일 업로드 형식으로 생성됩니다. "찾아보기" 버튼(클릭 시)을 사용하면 사용자가 하드 드라이브에서 파일을 선택하여 웹 서버에 업로드할 수 있습니다.
예를 들어, 새 이미지를 추가하기 위한 인터페이스를 만들기 위해 TextBox 컨트롤을 사용하여 이미지 제목을 캡처하고 FileUpload 컨트롤을 사용하여 사용자가 업로드할 이미지를 지정할 수 있도록 했습니다.
<b>Title:</b>
<asp:TextBox ID="PictureTitle" runat="서버" />
<br />
<b>사진:</b>
<asp:FileUpload ID="UploadedFile" runat="server" />
<br />
<asp:LinkButton ID="btnInsert" runat="server" Text="Insert" />
<asp:LinkButton ID="btnCancel" runat="server" Text="Cancel" />
위 코드는 사용자가 웹 서버에 업로드할 하드 드라이브의 파일을 지정할 수 있는 페이지를 만듭니다.
사용자가 파일을 선택하고 양식을 보내면(예: "삽입" 버튼 클릭) 지정된 파일의 바이너리 콘텐츠가 웹 서버로 전송됩니다. 서버측 코드에서 이 이진 데이터는 다음 태그 및 코드에서 설명한 것처럼 FileUpload 컨트롤의 PostedFile.InputStream 속성을 통해 사용할 수 있게 됩니다.
Protected Sub btnInsert_Click(ByVal sender As Object, ByVal e As System.EventArgs)는 btnInsert를 처리합니다. 딸깍 하는 소리
'파일이 성공적으로 업로드되었는지 확인하세요.
UploadedFile.PostedFile이 아무것도 아닌 경우 OrElse String.IsNullOrEmpty(UploadedFile.PostedFile.FileName) OrElse UploadedFile.PostedFile.InputStream이 아무것도 아닌 경우
...오류 메시지 표시...
하위 종료
종료 조건
'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"
그렇지 않은 경우
'잘못된 파일 형식 업로드... 오류 메시지 표시...
하위 종료
End
'데이터베이스에 연결하고 Products 테이블에 새 레코드 삽입'을
선택합니다.
myConnection을 New로 사용 SqlConnection(ConfigurationManager.ConnectionStrings("ImageGalleryConnectionString").ConnectionString)
Const SQL As String = "INSERT INTO [Pictures] ([Title], [MIMEType], [ImageData]) VALUES (@Title, @MIMEType, @ 이미지데이터)"
myCommand를 새 SqlCommand(SQL, myConnection)로 사용
myCommand.Parameters.AddWithValue("@Title", PictureTitle.Text.Trim())
myCommand.Parameters.AddWithValue("@MIMEType", MIMEType)
'FileUpload 컨트롤의 InputStream을 바이트 배열로 로드합니다.
Dim imageBytes(UploadedFile.PostedFile.InputStream.Length)를 바이트로 표시
UploadedFile.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length)
myCommand.Parameters.AddWithValue("@ImageData", imageBytes)
myConnection.Open()
myCommand.ExecuteNonQuery()
myConnection.Close()
사용 종료
End
SubHere. 이 이벤트 핸들러는 먼저 파일이 업로드되었는지 확인합니다. 그런 다음 업로드되는 파일 확장자를 기반으로 MIME 유형을 결정합니다.
위에서 가장 주목할만한 부분은 @ImageData 매개변수를 설정하는 코드 섹션입니다. 먼저 imageBytes라는 바이트 배열을 만들고 그 길이를 업로드되는 파일의 해당 InputStream으로 만듭니다. 그런 다음, InputStream의 Read 메서드를 사용하여 이진 콘텐츠를 이 바이트 배열에 채웁니다. @ImageData의 값으로 지정되는 것은 이 바이트 배열입니다.