2012-09-21 35 views
19

Tôi đang làm việc để tải lên tệp qua trang web có thanh tiến trình sử dụng Valums file uploader. Hầu hết mọi thứ hoạt động tốt, nhưng tôi không thể thay đổi thư mục tmp mặc định, nơi tệp được lưu trữ trong khi tải lên.Cài đặt PHP tmp dir - Tải lên PHP không hoạt động

tập tin nên được lưu trữ trong thư mục /upload và không có trong hệ thống mặc định /tmp thư mục, bởi vì /tmp được gắn trong một đĩa RAM có kích thước của nó bị hạn chế đến 4   MB và người dùng sẽ được tải lên file khoảng 10   MB.

Tôi đã tìm kiếm rất nhiều trang web nhưng không có giải pháp nào hoạt động. tôi đã thiết lập thư mục tạm trong php.ini:

upload_tmp_dir =/upload 

tôi đã thiết lập quyền cho /upload dir, và apache là chủ sở hữu của các tập tin, vì vậy các thư mục là chắc chắn có thể ghi bằng PHP.

Tôi đã đặt đường dẫn đích trong trình tải tệp lên /upload, vì tôi muốn các tệp được lưu trữ sau khi tải lên cũng trong thư mục này. Kết quả cuối cùng là các tệp nhỏ đang được tải lên thành công, nhưng tệp lớn hơn 4   MB không tải lên được — lý do duy nhất của hành vi này đến với tâm trí của tôi là các tệp được lưu trữ trong /tmp khi tải lên. Để chắc chắn, tôi đã kiểm tra nó với sys_get_temp_dir() và kết quả là /tmp -so PHP bỏ qua chỉ thị php.ini của tôi hoặc có một số cách khác để đặt nơi tệp được lưu trữ trong khi tải lên.

Ồ và thông tin cuối cùng: open_basedir không được đặt, do đó, quyền truy cập PHP vào đĩa chỉ bị giới hạn bởi quyền đối với tệp.

+2

Bạn khởi động lại máy chủ của bạn (xin lỗi vì câu hỏi ngớ ngẩn này)? – soju

+0

Không có câu hỏi ngớ ngẩn, chỉ là câu trả lời ngớ ngẩn :). Có, tôi đã thực hiện nó nhiều lần trong khi cố gắng giải quyết vấn đề và thử các giải pháp khác nhau. – Wookie88

+0

Bạn đã kiểm tra xem php chưa được cài đặt là cgi mod chưa? (Từ doc: * Nếu thư mục được chỉ định ở đây không thể ghi được, PHP rơi trở lại thư mục tạm thời mặc định của hệ thống *) – soju

Trả lời

50

Sự cố được mô tả ở đây đã được tôi giải quyết khá lâu rồi nhưng tôi không thực sự nhớ lý do chính khiến video tải lên không hoạt động. Có nhiều thứ cần sửa chữa để tải lên có thể hoạt động. Tôi đã tạo danh sách kiểm tra có thể giúp những người khác gặp sự cố tương tự và tôi sẽ chỉnh sửa danh sách kiểm tra để làm cho nó hữu ích nhất có thể. Như tôi đã nói trước đây về trò chuyện, tôi đã làm việc trên hệ thống nhúng, vì vậy một số điểm có thể bị bỏ qua trên các hệ thống không được nhúng.

  • Kiểm tra upload_tmp_dir bằng php.ini. Đây là thư mục mà PHP lưu trữ các tệp tạm thời trong khi tải lên.

  • Kiểm tra open_basedir bằng php.ini. Nếu được định nghĩa, nó giới hạn quyền đọc/ghi PHP đối với đường dẫn đã chỉ định và các thư mục con của nó. Đảm bảo rằng upload_tmp_dir nằm trong đường dẫn này.

  • Kiểm tra post_max_size bằng php.ini. Nếu bạn muốn tải lên 20 tệp Mbyte, hãy thử một số thứ lớn hơn một chút, chẳng hạn như post_max_size = 21M. Điều này xác định kích thước lớn nhất của tin nhắn POST mà bạn có thể đang sử dụng trong quá trình tải lên.

  • Kiểm tra upload_max_filesize bằng php.ini. Điều này chỉ định tệp lớn nhất có thể được tải lên.

  • Kiểm tra memory_limit bằng php.ini. Đó là số lượng bộ nhớ tối đa mà một tập lệnh có thể tiêu thụ. Nó là khá rõ ràng rằng nó không thể thấp hơn kích thước tải lên (thành thật mà nói tôi không khá chắc chắn về nó-PHP có lẽ là đệm trong khi sao chép các tập tin tạm thời).

  • Đảm bảo rằng bạn đang kiểm tra tệp php.ini đúng là tệp PHP được sử dụng trên máy chủ web của bạn.Giải pháp tốt nhất là thực thi tập lệnh với chỉ thị được mô tả tại đây http://php.net/manual/en/function.php-ini-loaded-file.php (php_ini_loaded_file chức năng)

  • Kiểm tra xem php người dùng chạy như thế nào (Xem tại đây cách thực hiện: How to check what user php is running as?). Tôi đã làm việc trên các distro và máy chủ khác nhau. Đôi khi nó là apache, nhưng đôi khi nó có thể là root. Dù sao, hãy kiểm tra xem người dùng này có quyền đọc và viết trong thư mục và thư mục tạm thời mà bạn đang tải lên hay không. Rà soát tất cả các thư mục trong đường dẫn trong trường hợp bạn đang tải lên vào thư mục con (ví dụ /dir1/dir2/ -Kiểm tra cả dir1dir2.

  • Trên nền tảng nhúng đôi khi bạn cần phải hạn chế bằng văn bản cho hệ thống tập tin gốc vì nó được lưu trữ trên thẻ flash và điều này giúp kéo dài tuổi thọ của thẻ này.Nếu bạn đang sử dụng tập lệnh để bật/tắt ghi tệp, hãy đảm bảo rằng bạn bật ghi trước khi tải lên.

  • Tôi gặp vấn đề nghiêm trọng với PHP> 5.4 giám sát tải lên dựa trên phiên (như được mô tả ở đây http://phpmaster.com/tracking-upload-progress-with-php-and-javascript/) trên một số nền tảng Hãy thử một cái gì đó đơn giản lúc đầu tiên (như ở đây: http://www.dzone.com/snippets/very-simple-php-file-upload) .Nếu nó hoạt động, bạn có thể thử mech phức tạp hơn anisms.

  • Nếu bạn thực hiện bất kỳ thay đổi nào trong php.ini, hãy nhớ khởi động lại máy chủ để cấu hình sẽ được tải lại.

+0

Danh sách kiểm tra tốt - cảm ơn! – Olaf

+0

'memory_limit' không phải là vấn đề đối với video tải lên. Xem http://stackoverflow.com/a/5828654/956397 – PiTheNumber

+0

Nếu bạn không định đọc toàn bộ tệp trong PHP, bạn đã đúng. Tuy nhiên, bạn nên giữ điểm này trong danh sách kiểm tra để giữ cho nó phổ biến hơn. – Wookie88

1

Tôi gặp khó khăn với vấn đề này trong một thời gian dài ... Giải pháp của tôi là sửa đổi tệp php.ini, trong thư mục chứa tập lệnh php. Điều này là quan trọng, như sửa đổi php.ini tại gốc đã không giải quyết vấn đề (tôi có một php.ini trong mỗi thư mục để kiểm soát chi tiết). Các mục có liên quan trong php.ini của tôi trông như thế này .... (các output_buffering là không có khả năng cần thiết cho vấn đề này)

output_buffering = On 
upload_max_filesize = 20M 
post_max_size = 21M 
Các vấn đề liên quan