image.fromStream (postedfile.inputStream)이 실패합니다. (매개 변수는 유효하지 않습니다.) (Asyncfileupload))
-
06-07-2019 - |
문제
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.
}
}
업데이트: 교차 관리 경계 문제는 반대 (응답 스트림 사용)에서만 발생하지만 업로드 스트림이 아닌 것처럼 보이지만 완전히 확실하지는 않습니다.