2011-02-04 30 views
8

Tôi có một tập lệnh PHP để tải lên hình ảnh JPEG (thông qua biểu mẫu HTML). Bạn có thể thấy mã số here, nhưng tôi sẽ cố gắng trình bày các phần liên quan trong bài đăng này. Các hình thức được khai báo như sau:Các tệp JPEG được tải lên tập lệnh PHP bị hỏng - nhưng không phải lúc nào cũng như

<form action="adm_addphoto.php" method="POST" enctype="multipart/form-data" name="myform"> 

Trường MAX_FILE_SIZE hình thức được thiết lập để 5MB:

<input type="hidden" name="MAX_FILE_SIZE" value=5242880> 

Những hình ảnh tôi muốn tải lên khoảng 3MB trong kích thước.

Sau khi đã tải lên, tôi bật các tập tin hình ảnh vào một jpeg GD:

$filename = $_FILES['file']['tmp_name']; 
$myImage = imagecreatefromjpeg($filename); 

Đôi khi upload hoạt động tốt, và đôi khi imagecreatefromjpeg phát ra cảnh báo về JPEG là tham nhũng. Ví dụ: (ngắt dòng được thêm vào để dễ đọc):

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 

Điều này không xảy ra đáng tin cậy. Tức là, nếu tôi thử cùng một hình ảnh nhiều lần liên tiếp, đôi khi nó sẽ tải lên thành công và đôi khi sẽ có lỗi. Và trong các nỗ lực dẫn đến lỗi, thông tin cụ thể của thông báo lỗi cũng sẽ thay đổi. (Với ảnh cụ thể đã tạo ra các thông báo trên, số lượng "các byte không liên quan" đôi khi là 47, đôi khi 20, đôi khi 68.)

Điều gì có thể khiến các tệp bị hỏng trên một số lần thử chứ không phải các tệp khác?

PS. Tôi biết rằng có một thiết lập ini bảo GD cố gắng làm việc với các ảnh JPEG bị hỏng. Nhưng đó không phải là vấn đề, tôi muốn biết tại sao kết quả tải lên không phù hợp.

PPS. Dưới đây là các giá trị của một số cài đặt ini có thể có liên quan đến PHP:

memory_limit .......... 128M 
post_max_size ......... 8M 
file_uploads .......... On 
max_file_uploads ...... 20 
upload_max_filesize ... 128M 
upload_tmp_dir ........ no value 

CẬP NHẬT: Tôi đã thêm mã để phản hồi kích thước và MD5 checksum khi tệp được tải lên. Kích thước luôn là kích thước chính xác (kích thước của bản sao tệp cục bộ của tôi). MD5, tuy nhiên, khác nhau giữa các lần thử. Khi MD5 là chính xác (khớp với MD5 của bản sao cục bộ của tôi), không có thông báo lỗi. Khi có thông báo lỗi, MD5 luôn khác với mong đợi. Ngoài ra, đây chỉ là một sự khác biệt cảm nhận, nhưng các lỗi dường như xảy ra thường xuyên hơn đêm qua so với sáng nay - chỉ một số ít chuyển giao sáng nay dẫn đến một lỗi.

Dưới đây là một số cập nhật "xấu" (một cách tò mò, đã có một vài cập nhật mà đưa ra một checksum MD5 khác với kỳ vọng nhưng đã không tạo ra lỗi):

    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: Để đối phó với Andre và Pekka: Đây là các liên kết đến hai phiên bản của cùng một hình ảnh. This one là bản gốc của hình ảnh, như được lưu trữ trên máy của tôi; Tôi đã tải nó lên theo cách tôi thường tải các tệp lên webhosting của mình, tức là tôi đã sử dụng một ứng dụng khách FTP. This one là cùng một hình ảnh, được tải lên bằng tập lệnh của tôi (nhưng với một dòng được thêm vào để di chuyển nó đến vị trí đó bằng cách sử dụng move_uploaded_file()). Thông báo lỗi trên video tải lên đó là "Dữ liệu JPEG bị hỏng: 30 byte không liên quan ...". Bạn sẽ nhận thấy rằng phần dưới cùng của hình ảnh xuất hiện không chính xác. Tôi xin lỗi vì kích thước lớn của hình ảnh, nhưng tôi chỉ có thể sử dụng các ví dụ về loại hình ảnh đang gây ra vấn đề cho tôi.

  • Tôi phải nói rõ rằng đây là hình ảnh khác với hình ảnh tôi đã sử dụng cho các tổng kiểm tra MD5 ở trên. Tôi không nghĩ sử dụng cùng một hình ảnh.

CẬP NHẬT: Sử dụng hai hình ảnh tôi đã liên kết ở trên, tôi đã tìm thấy sự khác biệt giữa hai tệp. Có hai chuỗi 32 byte khác nhau trong một hình ảnh từ hình ảnh khác. Các tệp khác nhau.

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

Bạn có nhận được các thông báo lỗi đó từ mục nhập nhật ký không? Ai đang tải lên? –

+0

Tôi đang tải lên. Những lỗi này là đầu ra cho trình duyệt, bởi vì tôi đang cố gỡ lỗi vấn đề, vì vậy tôi đã bật báo cáo lỗi. – Hammerite

+0

Để đảm bảo, bạn chỉ có một máy chủ web để chỉ có một cấu hình php/gd? – Damp

Trả lời

3

Bạn có chắc chắn không có vấn đề gì với kết nối internet của mình? Bạn đã thử nó từ một kết nối khác hay thậm chí là ISP?

+0

Tôi sẽ liên hệ lại với bạn về điều này khi tôi đã có cơ hội dùng thử trên máy của tôi tại nơi làm việc. – Hammerite

+0

Vâng, tôi đã thử tải lên 4 hình ảnh từ máy của tôi tại nơi làm việc, mỗi lần 10 lần và tôi không thấy bất kỳ lỗi nào - vì vậy tôi phải kết luận rằng rất có thể đó chỉ là vấn đề với kết nối Internet của tôi.Đó là một sự xấu hổ không thể để chẩn đoán chính xác hơn những gì vấn đề là, cũng không làm bất cứ điều gì về nó. Tôi sẽ phải tải ảnh của tôi lên công việc, tôi đoán vậy. – Hammerite

0

của nó một đoạn, nhưng một trong những vấn đề có thể tôi có thể nghĩ là bạn đang làm việc trên các tập tin tạm thời, hãy thử sử dụng move_uploaded_file để di chuyển các tập tin đến một nơi nào bạn đã chỉ định, và xem nếu mà làm cho một Sự khác biệt?

+0

Tôi hiện đã thử thêm mã sử dụng move_uploaded_file() để di chuyển tệp trước khi thử sử dụng nó. Nó dường như không tạo ra bất kỳ sự khác biệt nào đối với các thông báo lỗi hoặc tần suất chúng xảy ra. – Hammerite

0

Thay vì cố gắng chuyển đổi vào thời điểm này, đổ các thông tin tập tin tạm thời và so sánh kích thước tập tin, vv

Do tính chất ngẫu nhiên điều này, nó có lẽ là một số hình thức của vấn đề truyền dẫn. Bạn có thể loại bỏ phần cứng của riêng mình bằng cách cố gắng di chuyển một tệp zip cỡ lớn (ví dụ) từ máy tính bạn đang chạy đến một thứ khác trên mạng cục bộ (nhiều lần) và sau đó xem tệp zip vượt qua kiểm tra crc hay không bị hỏng.

Ngoài ra: bạn có đang chạy một thiết bị tường lửa thu hút lưu lượng truy cập http không? (ví dụ: untangle)

+0

Tôi đã thêm vào tập lệnh một dòng lặp lại kích thước của tệp tạm thời và thử tải lên tệp một vài lần. Kích thước tệp được lặp lại luôn giống nhau: 2803547, kích thước của bản sao tệp được lưu trữ trên máy của tôi. Kích thước tệp này giống nhau bất kể thông báo lỗi có xuất hiện hay không và bất kể thông tin cụ thể của lỗi. – Hammerite

+0

Tôi đang chạy Windows Vista SP2. Tường lửa của Windows được bật. (Tôi đã thử sử dụng Opera, được kích hoạt như một ngoại lệ trong cấu hình của Windows Firewall và thấy hành vi tương tự.) Tôi có Avast! Đã cài đặt bản Antivirus (phiên bản miễn phí). Tôi chưa cài đặt tường lửa thương mại. Tôi kết nối với internet từ nhà của tôi thông qua một bộ định tuyến băng thông rộng. Ngoài ra: xin vui lòng xem cập nhật của tôi cho câu hỏi, lại: MD5 checksums. – Hammerite

Các vấn đề liên quan