2010-03-16 52 views
7

Thứ nhất: Tôi là một nhà thiết kế web kém hiểu biết đủ PHP để trở nên nguy hiểm và chỉ đủ về quản trị máy chủ là, tốt, không có gì. Tôi có lẽ sẽ không hiểu bạn trừ khi bạn rất rõ ràng!.exe Tệp bị hỏng khi tải xuống từ máy chủ

Thiết lập: Tôi đã thiết lập trang web nơi khách hàng tải tệp lên một thư mục cụ thể và các tệp đó được cung cấp qua php để người dùng tải xuống. Các tệp này thường là các tệp thực thi trên 50MB. Khách hàng không muốn họ nén, vì họ cảm thấy người dùng của họ không đủ hiểu biết để giải nén chúng. Tôi đang sử dụng php dưới đây để buộc một hộp thoại tải xuống và ẩn thư mục chứa các tệp.

Máy chủ Linux, nếu điều đó tạo nên sự khác biệt.

Sự cố: Có một tệp nhất định bị hỏng sau khi người dùng cố gắng tải xuống. Nó là một tập tin thực thi, nhưng khi nó được nhấp vào, một cửa sổ DOS trống sẽ mở ra. Tệp gốc, trước khi tải xuống mở hoàn toàn. Có một số tệp tương tự khác trải qua cùng một quy trình tải xuống chính xác và tất cả các tệp đó đều hoạt động tốt.

Những điều tôi đã thử: Tôi đã thử tải lên tệp đã nén, sau đó giải nén tệp trên máy chủ để đảm bảo nó không bị hỏng trong quá trình tải lên và không may mắn.
Tôi cũng so sánh mã nhị phân của tệp gốc với tệp đã tải xuống không hoạt động và chúng giống hệt nhau (vì vậy, php không vô tình chèn thêm bất kỳ thứ gì vào tệp).

Có thể là vấn đề với tiêu đề trong hàm downloadFile của tôi không? Tôi thực sự không chắc chắn làm thế nào để khắc phục sự cố này ...

Đây là tải về php, nếu nó có liên quan ($ filenamereplace được định nghĩa ở nơi khác):

downloadFile("../DIRECTORY/files/$filenamereplace","$filenamereplace"); 

function downloadFile($file,$filename){  
    if(file_exists($file)) { 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/octet-stream'); 
     header('Content-Disposition: attachment; filename="'.$filename.'"'); 
     header('Content-Transfer-Encoding: binary'); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header('Pragma: public'); 
     header('Content-Length: ' . filesize($file)); 
     @ flush(); 
     readfile($file); 
     exit; 
    } 
} 

ETA additonal Thông tin: - Các xét nghiệm để làm việc/các tệp không hoạt động đã được thực hiện trên cùng một máy - Nếu nó tạo ra bất kỳ sự khác biệt nào, tệp gốc có biểu tượng tùy chỉnh. Sau khi tải xuống, tệp có biểu tượng tài liệu trống chung.

Thông tin bổ sung: Tôi nghĩ rằng điều này là quan trọng nhất! Tôi vừa thử tải xuống tệp trực tiếp (để bỏ qua liên kết tải xuống kích hoạt chức năng tải xuống ở trên). Nếu tôi tải về tập tin bằng cách chỉ cần đi đến url của nó và tải nó theo cách đó, các tập tin tải về WORKS. Vì vậy, tôi nghĩ rằng nó phải có một cái gì đó để làm với các chức năng tải về. Nhưng cái gì??

3/17 SỬA ĐỔI CHỦ YẾU —AND RESOLVED - Vì vậy, tôi thức dậy sáng nay và tôi cho rằng có thể tôi đã so sánh các tệp sai. (Tôi đã lưu lại chúng dưới dạng văn bản nhị phân và rồi so sánh chúng. Tôi đã không nhận ra chương trình so sánh sẽ thực hiện và so sánh các tệp exe thực tế). Sáng nay tôi đã thử so sánh các tệp exe thực tế và có sự khác biệt. Có một dòng mã php đã được đưa vào dòng đầu tiên của tệp. Tôi đã điều chỉnh php và sự cố đã được khắc phục. (Đó là từ câu lệnh if/else đã định nghĩa biến $ filenamereplace trong mã mà tôi đã trích dẫn). Cảm ơn bạn một lần nữa vì sự giúp đỡ của bạn và xin lỗi vì đã gây hiểu nhầm cho bạn trong việc nhấn mạnh rằng nội dung của các tệp giống hệt nhau!

+0

Tôi không nghĩ bạn phải xóa tiêu đề. một số trình chỉnh sửa hex có thể so sánh các tệp –

+0

Tôi có nên xóa "@ flush()" đó không? dòng, sau đó? Có thể xả các tiêu đề là những gì gây ra vấn đề, hoặc bạn chỉ nói rằng nó không cần thiết. (Tôi thực sự không biết nó thực sự làm gì ...) – Kerri

+0

Một chút làm rõ - bạn có thể mở tệp gốc (tải lên trước) trên cùng một máy mà phiên bản đã tải xuống không hoạt động không? Chỉ cần chắc chắn để loại bỏ bất kỳ vấn đề cụ thể máy? Nếu các bit giống nhau và các exes khác tải xuống tốt, có vẻ như với tôi bạn cần bắt đầu xem xét các vấn đề về cấu hình môi trường (ví dụ: máy)? – Eric

Trả lời

3

"Tôi cũng đã so sánh mã nhị phân của tệp gốc với tệp đã tải xuống không hoạt động và chính xác như vậy (do đó, php không vô tình chèn thêm bất kỳ thứ gì vào tệp)."

Nếu điều đó thực sự đúng, thì vấn đề phải là cách exe được bắt đầu sau khi nó được tải xuống. Nó chắc chắn không phải là một vấn đề với mã PHP của bạn.

+0

Bạn có thể cho tôi biết thêm về ý nghĩa của bạn bằng cách "exe được bắt đầu sau khi nó đã được tải xuống" không? Tôi có kiểm soát được điều này từ trang web không? Cảm ơn! – Kerri

+0

Sau khi exe được tải xuống, nó phải được bắt đầu. Bởi "làm thế nào" tôi có nghĩa là trình duyệt bắt đầu nó, không người dùng nhấp vào nó trong thám hiểm, vv Bạn không có quyền kiểm soát đó. Đó là một nơi kỳ lạ cho một vấn đề mặc dù, do đó, bạn có chắc chắn 10000% các tập tin là nhị phân giống hệt nhau? –

+0

Tệp có nghĩa là phải được người dùng nhấp đúp để bắt đầu. Đó là một tệp cài đặt và quá trình cài đặt sẽ bắt đầu khi được nhấp vào. Thay vào đó, một cửa sổ DOS trống sẽ xuất hiện. – Kerri

3

Có thể họ đã bị hỏng khi tải lên. Điều này có thể xảy ra nếu bạn chuyển chúng qua FTP ở chế độ ASCII thay vì BINARY.

+0

+1 vì bản thân tôi đã phạm sai lầm. – Xetius

+0

"Những điều tôi đã thử: Tôi đã thử tải lên tệp nén, sau đó giải nén nó trên máy chủ để đảm bảo rằng nó không bị hỏng trong quá trình tải lên và không có may mắn". – plod

+0

Đó là suy nghĩ đầu tiên của tôi, thực sự. Đó là lý do tại sao tôi đã thử tải nó lên máy chủ trước tiên như một tệp nén, sau đó giải nén nó sau khi nó được tải lên. Điều đó sẽ không tránh được bất kỳ vấn đề tham nhũng nào đối với tệp exe thực tế khi tải lên? (Hah. Plod đánh tôi với nó) – Kerri

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