2011-02-04 6 views
8

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 
+0

로그 항목에서 이러한 오류 메시지를 받았습니까? 누가 업로드를하고 있었습니까? –

+0

나는 업로드를하고있다. 문제를 디버깅하려고하기 때문에 이러한 오류가 브라우저에 출력되었으므로 오류보고가 활성화되었습니다. – Hammerite

+0

단지 하나의 웹 서버 만 가지고 있으므로 하나의 php/gd 구성 만 있습니까? – Damp

답변

3

인터넷 연결에 문제가 있습니까? 다른 연결이나 ISP에서 시도해 보셨습니까?

+0

직장에서 컴퓨터를 사용해 볼 기회가 생겼을 때 다시 알려 드리겠습니다. – Hammerite

+0

글쎄, 직장에서 내 컴퓨터에서 4 번 이미지를 업로드하려고 시도했는데, 각각 10 번 시도했는데 오류가 전혀 표시되지 않았으므로 인터넷 연결 문제 일 가능성이 높습니다.문제가 무엇인지를 더 정확히 진단 할 수 없거나 그것에 대해 아무 것도 할 수없는 것은 부끄러운 일입니다. 나는 직장에서 사진을 업로드해야 할 것입니다. – Hammerite

0

그것의 스트레칭,하지만 내가 생각할 수있는 하나의 가능한 문제는 임시 파일을 작업하는 것을, 그건 만드는 경우가 지정한 곳으로 파일을 이동하고, 볼 인 move_uploaded_file를 사용하려고입니다 차? 이 시점에서 변환을 시도 임시 파일 정보를 덤프하고이 때문에 임의의 특성 파일 크기 등

을 비교하기보다는

+0

나는 이제 파일을 사용하기 전에 move_uploaded_file()을 사용하여 코드를 추가하려고 시도했습니다. 오류 메시지 또는 오류 발생 빈도에 차이가없는 것으로 보입니다. – Hammerite

0

, 그것은 아마 전송 문제의 형태입니다. 적절한 크기의 zip 파일 (예 :)을 실행중인 컴퓨터에서 로컬 네트워크의 여러 다른 항목 (여러 번)으로 이동 한 다음 zip 파일이 crc 검사를 통과하는지 확인하거나 손상된다.

또한 http 트래픽을 감지하는 방화벽 어플라이언스를 실행하고 있습니까? (예 : 끝이 아님)

+0

스크립트에 임시 파일의 크기를 표시하는 줄을 추가하고 파일을 몇 번 업로드하려고 시도했습니다. 에코 된 파일 크기는 항상 동일합니다 : 2803547, 내 컴퓨터에 저장된 파일의 복사본 크기입니다. 이 파일 크기는 오류 메시지의 표시 여부와 관계없이 오류의 세부 사항과 관계없이 동일합니다. – Hammerite

+0

Windows Vista SP2를 실행하고 있습니다. Windows 방화벽이 사용됩니다. (필자는 Windows 방화벽의 구성에서 예외로 설정된 Opera를 사용해 보았지만 동일한 동작을 보았습니다.) 나는 Avast! 바이러스 백신 (무료 버전)이 설치되어 있습니다. 상업용 방화벽이 설치되어 있지 않습니다. 광대역 라우터를 통해 집에서 인터넷에 연결합니다. 또한 : 질문에 대한 내 업데이트를 참조하십시오 : MD5 checksums. – Hammerite

관련 문제