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
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? –
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
Để đảm bảo, bạn chỉ có một máy chủ web để chỉ có một cấu hình php/gd? – Damp