image.fromStream (postedfile.inputStream)이 실패합니다. (매개 변수는 유효하지 않습니다.) (Asyncfileupload))

StackOverflow https://stackoverflow.com/questions/1614773

문제

AsyncfileUpload (Ajax 툴킷)를 사용하여 이미지를 업로드하고 있습니다. 이미지 크기 조정을 처리하는 버튼이 있습니다. 이것은 얼마 동안 잘 작동했지만 더 이상은 아닙니다 ...

protected void BtnUploadImage_Click(object sender, EventArgs e)
{
    var imageFileNameRegEx = new Regex(@"(.*?)\.(jpg|jpeg|png|gif)$", 
        RegexOptions.IgnoreCase);
    if (!AsyncFileUpload1.HasFile || 
        !imageFileNameRegEx.IsMatch(AsyncFileUpload1.FileName))
    {
        AsyncFileUpload1.FailedValidation = true;
        ErrorLabel.Visible = true;
        return;
    }
    ErrorLabel.Visible = false;

    var file = AsyncFileUpload1.PostedFile.InputStream;

    var img = Image.FromStream(file, false, false);

...
}

내가 이상하게 생각하는 또 다른 것 : 80kb보다 작은 이미지를 시도하면 작동합니다 ..!

서버를 다시 시작하려고했지만 변경하지 않았습니다. 내 컴퓨터에서 동일한 코드가 잘 작동합니다. (이전 들었어 ?? :))

또한 서버에 파일을 저장 한 다음 파일 Trough Image.fromFile ()을 가져 오려고했지만 "닫힌 파일에 액세스 할 수 없습니다".

이것을 해결하는 방법?

도움이 되었습니까?

해결책

스트림이 처음에 배치되어 있는지 확인합니다.

var file = AsyncFileUpload1.FileContent;
file.Seek(0, SeekOrigin.Begin);

var img = Image.FromFile(file);

확인해야 할 두 번째 사항 : 그만큼 requestLengthDiskThreshold 환경. 지정되지 않으면이 설정은 기본값이 ... 예, 80 KB입니다.

메모: IMO 이미지를 사용하여 파일 스트림을 직접 읽거나 중간 메모리 스트림을 사용하는지 여부에 관계없이 전반적인 차이가 없어야합니다 (후자의 경우 실제로 전체 파일을 메모리에 두 번로드한다는 사실을 제외하고). 원래 파일 스트림을 읽으므로 스트림 위치, CAS 권리, 파일 권한 등이 여전히 적용됩니다.

노트 2: 그리고 그렇습니다. 반드시 해당 자원이 제대로 처분되어 있는지 확인하십시오 :)

다른 팁

이것은 맞습니다. 작동하지 않습니다. 문제는 관리/관리되지 않은 경계를 넘어서서 최근에 동일하게 만났다는 것입니다. 다른 문제는 스트림이 직접 존재하지 않고 이미지가 없다는 것입니다.

솔루션은 매우 간단합니다. 게시물에서 MemoryStream으로 모든 것을 읽으십시오 (사용 만 사용하십시오. new MemoryStream()) 그리고 메모리 스트림을 사용하십시오 Image.FromStream. 이것은 당신의 문제를 해결할 것입니다.

올바르게 사용하십시오 using 함께 일할 때 Image, Graphics 그리고 Stream에스. 그들 모두는 사용하지 않고 idisposable과 asp.net 환경에서 구현합니다. using 올바르게 차단하면 장기적으로 메모리 사용량과 기타 불쾌한 부작용을 증가시킬 수 있습니다 (및 ASP.NET 앱은 매우 오래 실행됩니다!).

솔루션은 다음과 같이 보일 것입니다.

using(Stream memstr = new MemoryStream())
{
    // copy to a memory stream
    Stream uploadStream = AsyncFileUpload1.PostedFile.InputStream;
    byte[] all = new byte[uploadStream.Length];
    uploadStream.Read(all, 0, uploadStream.Length);
    memstr.Write(all, 0, uploadStream.Length);
    memstr.Seek(0, SeekOrigin.Begin);
    using(Graphics g = Graphics.FromStream(memstr))
    {
         // do your img manipulation, or Save it.
    }
}

업데이트: 교차 관리 경계 문제는 반대 (응답 스트림 사용)에서만 발생하지만 업로드 스트림이 아닌 것처럼 보이지만 완전히 확실하지는 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top