HTML 형식을 통해 JPEG 이미지를 업로드하는 PHP 스크립트가 있습니다. 코드 here을 볼 수 있지만 관련 게시물을이 게시물에 표시하려고 시도합니다. 이 양식과 같이 선언한다 :PHP 스크립트에 업로드 된 JPEG 파일이 손상되었지만 항상 손상되지는 않습니다.
<form action="adm_addphoto.php" method="POST" enctype="multipart/form-data" name="myform">
MAX_FILE_SIZE
양식 필드가 5메가바이트으로 설정됩니다
<input type="hidden" name="MAX_FILE_SIZE" value=5242880>
I 업로드 할 이미지의 크기는 약 3MB입니다.
$filename = $_FILES['file']['tmp_name'];
$myImage = imagecreatefromjpeg($filename);
때때로 업로드가 잘 작동하고, 때로는 imagecreatefromjpeg
은 JPEG가 손상된 것에 대해 경고를 방출 :이 업로드 일단
, 나는 GD의 JPEG로 이미지 파일을 설정합니다. 예 : (가독성을 위해 줄 바꿈을 추가 함) :
Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]:
gd-jpeg, libjpeg: recoverable error: Corrupt JPEG data:
47 extraneous bytes before marker 0xd9 in
/path/adm_addphoto.php on line 97
Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]:
'/tmp/phpwlSS9x' is not a valid JPEG file in
/path/adm_addphoto.php on line 97
이는 실제로 발생하지 않습니다. 즉, 동일한 이미지를 여러 번 연속해서 시도하면 가끔씩 성공적으로 업로드되고 때로는 오류가 발생하게됩니다. 오류가 발생하는 시도 내에서 오류 메시지의 세부 사항도 달라집니다. (위의 메시지를 생성 한 특정 사진의 경우 "외부 바이트"의 수가 47 개, 때로는 20 개, 가끔은 68 개입니다.)
일부 시도에서는 파일이 손상 될 수 있지만 다른 파일에서는 손상 될 수 있습니다.
추신. 나는 GD에게 손상된 JPEG로 작업하기 위해 열심히 노력할 것을 지시하는 ini 설정이 있음을 알고 있습니다. 하지만 요점은 아니며 업로드 결과가 왜 일관성이 없는지 알고 싶습니다.
PPS. 다음은 몇 가지 가능성이 관련 PHP의 INI 설정의 값은 다음과 같습니다
memory_limit .......... 128M
post_max_size ......... 8M
file_uploads .......... On
max_file_uploads ...... 20
upload_max_filesize ... 128M
upload_tmp_dir ........ no value
업데이트 :이 업로드되면 파일의 크기와 MD5 체크섬을 반향하는 코드를 추가했다. 크기는 항상 올바른 파일 크기 (파일의 로컬 복사본 크기)입니다. 그러나 MD5는 시도마다 다릅니다. MD5가 정확하면 (내 로컬 사본의 MD5와 일치 함) 오류 메시지가 없습니다. 오류 메시지가있을 때 MD5는 항상 예상과 다릅니다. 또한 이것은 인식 된 차이 일 뿐이지 만 지난 밤에 오류가 더 자주 발생하는 것처럼 보였습니다. 오늘 아침에 소수의 전송으로 인해 오류가 발생했습니다.
Correct MD5: f7b9587f39c7332e62a08adf34cefbd0
-----------------------------------------------------------------
38 extraneous bytes: 2a28c46079071d9d2e2fd49865b35d59
ce1c69f798953b201dcc35f85f3b29b4
b013a0428a71adff674a46e92372d46b
71 extraneous bytes: a271928f3559b6deaa19804704b5bcb3
92 extraneous bytes: cab2a10ad8535addaca3b19bcb607a30
premature end of data segment: 4514d39db1d94ab691d6da26c0832cdb
No error (!): 83b2e3624ddcfdeb3efc10be81631916
07d0a97b21d423fdeb4c6f88d76f8cd3
UPDATE : 앙드레에 대응하고 여기에
은 (거기 예상하지만, 생산하지 않은 에러와 다른 MD5 체크섬을 준 업로드의 부부가 있었다, 호기심) 일부 "나쁜"업로드입니다 Pekka : 다음은 동일한 그림의 두 가지 버전에 대한 링크입니다. This one은 내 컴퓨터에 저장된 이미지의 원본 사본입니다. 보통 웹 호스팅에 파일을 업로드하는 방식으로 업로드했습니다. 즉 FTP 클라이언트를 사용했습니다. This one은 내 스크립트를 사용하여 업로드 한 동일한 이미지입니다 (단,move_uploaded_file()
을 사용하여 해당 위치로 이동하는 행이 추가됨). 해당 업로드의 오류 메시지는 "손상된 JPEG 데이터 : 30 개의 관련 바이트 ..."입니다. 이미지의 아래쪽 부분이 잘못 표시됩니다. 큰 이미지의 경우 사과 드리지만 문제가되는 이미지 유형의 예만 사용할 수 있습니다.
- 위의 MD5 체크섬에 사용 된 이미지와 다른 이미지임을 분명히해야합니다. 나는 같은 이미지를 사용하는 것을 생각하지 않았다.
업데이트 : 위의 두 이미지를 사용하여 두 파일의 차이점을 발견했습니다. 한 이미지에서 다른 이미지와 다른 32 바이트의 두 시퀀스가 있습니다. 파일은 다른 경우 동일합니다.
n.b. the first character is numbered as character 1, not character 0
n.b. 2116624 and 2493456 are both 16 modulo 32.
The difference between them is 368 * 1024.
character 2116624 through line 2116655 (32 characters):
original image:
3c bc 20 19 eb 93 cd 34 db 93 68 7c 8d 5e 37 d4
d3 84 91 70 7e 7c 82 3e e9 e8 3d eb 2e ff 00 ce
bad image:
89 c9 54 a6 e5 3d f4 fc 8e 7f 68 d5 47 14 41 f6
55 11 7d a6 55 24 a8 e0 f7 a8 a4 43 06 18 c2 c1
character 2493456 through character 2493487 (32 characters):
original image:
3d a4 61 37 19 75 63 2e 51 62 ca 07 e0 9e 49 35
5d 65 8d 22 01 7f 5e b4 a7 19 3a 7a ef 72 1c e3
bad image:
4f 99 26 39 6a db d9 cd 3e 5b ec 63 46 3c b4 ef
2d b6 30 35 0f 12 a1 b6 9a 11 68 1a 69 07 0c 49
로그 항목에서 이러한 오류 메시지를 받았습니까? 누가 업로드를하고 있었습니까? –
나는 업로드를하고있다. 문제를 디버깅하려고하기 때문에 이러한 오류가 브라우저에 출력되었으므로 오류보고가 활성화되었습니다. – Hammerite
단지 하나의 웹 서버 만 가지고 있으므로 하나의 php/gd 구성 만 있습니까? – Damp