2017-11-22 2 views
0

SO와 다른 곳에서 본 모든 질문은 잠재적 인 문제로 스트림을 닫거나 닫지 않는다고 말합니다. 그게 문제가 아니라면 저장하는 디렉토리의 존재 또는 권리가 문제입니다. 그 중 어떤 것도 여기에 적용 할 지 모르겠습니다. 부분적으로 이것은 DB에 저장된 특정 tif 파일에서만 발생하며 부분적으로 코드가 서버 파일 시스템에서 파일을 저장하거나 읽지 않기 때문입니다. 하지만 제작 서버에서 개발 컴퓨터를 가리키면 tif 파일을 jpg로 변환 할 수 있습니다. 따라서 특정 파일에서만 실패하고 프로덕션 서버에서는 실패합니다.tif에서 jpg로 변환 할 때 GDI + 일반 오류가 발생했습니다.

이것은 저에게 쓰여진 오래된 도서관 출신입니다. 우리는 최근 Windows 서버의 Temp 디렉토리를 삭제했습니다. 그게 어떤 문제를 일으킬 지 모르지만 그 정보도 같이 버릴 것이라고 생각했습니다.

GDI는 ConvertFrom 줄 또는 FromStream 줄에서 실패한 내용과 그렇지 않은 내용에 따라 실패합니다.

처음에는 tif 파일이 손상된 것 같았지만 변환하기 위해 dev 컴퓨터를 사용할 수 있다고 생각했습니다. 권한 또는 디렉토리 문제는 일부 tif 파일에서 작동하기 때문에 문제가되지 않아야합니다. 나는 명백한 무엇인가를 놓치고있는 것처럼 느낀다. 시도 할 수있는 도움이나 제안을 보내 주시면 감사하겠습니다. 스택 오버플로 표시 목적을 위해 코드에 슬래시를 추가했습니다. 포맷팅이 VB 주석 마커에서 실행되지 않았습니다. '

Private Function image2jpg(ByVal dID As Integer) As System.IO.MemoryStream 
    Dim sql As String = "SELECT blob FROM [Database].[schema].[table] WHERE dID = @dID" 
    Dim params As New DB_Methods.params("@dID", dID) 
    Dim img = DB_Methods.sqlQuickGetUSP(sql, "ADMIN", params, False) 
    Dim demBits As Byte() = CType(img(0)(0), Byte()) 


    //'new code i tried that also fails 
    Dim ic As System.Drawing.ImageConverter = New System.Drawing.ImageConverter() 
    Dim x As System.Drawing.Bitmap = ic.ConvertFrom(demBits) //'this is where GDI fails 
    Dim newImg = x 
    //'Throw New Exception(demBits.Length & " " & ms.Length) 

    //'Original code that was failing 
    //'Dim ms As System.IO.MemoryStream = New MemoryStream(demBits) 
    //'Dim tmpImg As System.Drawing.Image = System.Drawing.Image.FromStream(ms)'this is where GDI fails 
    //'Dim newImg As Drawing.Image = New Drawing.Bitmap(tmpImg, tmpImg.Width, tmpImg.Height) 

    Dim newStream As New MemoryStream 
    newImg.Save(newStream, ImageFormat.Jpeg) 
    Return newStream 
End Function 
+0

상당히 모호합니다. 파일과 디렉토리에 대해 이야기하지만 전혀 파일이 사용되지 않습니다. 이것은 dbase에 이미지를 추가하는 코드에서 쉽게 버그 일 수 있습니다. 더 많은 디버깅이 필요합니다. 반환 된 스트림은 그대로 사용할 수 없으므로 버그를 수정하십시오. newStream.Position = 0이 필요합니다. –

+0

@HansPassant 파일 시스템에 파일을로드하거나 저장하지 않습니다. 데이터베이스에서 varbinary (max) 열을 사용합니다. 이 열은 바이트 배열에 넣어지고 스트림에 저장됩니다. 그래서 아무 것도 디스크에 기록되지는 않을 것이라고 생각합니다. 업로드 코드에서 버그가 발생하면 내 개발 시스템도 실패 할 것으로 예상됩니다. 프로덕션 서버에서 디버깅에 대한 팁이 있습니까? 당신은 그것이 작동하지 않는다고하지만 그것이 효과가 있으며 10 년 가까이 일했다고 말한다. 코드의 표시에 도움이되는 // 주석을 추가했습니다. – Kevin

답변

0

문제는 CCITT 대신 JPEG 압축을 사용하여 생성되는 tif 파일 때문입니다. Older GDI TIFF JPEG issues

이전 버전의 GDI는 처리 할 수 ​​없지만 최신 버전은 처리 할 수 ​​있습니다. 프로덕션 서버가 2012 년이고 개발 컴퓨터가 windows 10입니다.

관련 문제