2009-04-15 6 views
18

Bạn có thể lưu trữ một hình ảnh trong một SESSION PHP không?PHP - Lưu trữ hình ảnh trong dữ liệu SESSION?

Tôi có quy trình đăng ký nhiều bước sử dụng PHP trên trang web của mình. Trên một trong các bước, người dùng có thể tải lên biểu tượng công ty của họ (hình ảnh).

Bước cuối cùng là xử lý thẻ tín dụng của họ.

Vì vậy, trước khi tôi viết bất kỳ hình ảnh nào lên máy chủ web và vị trí hình ảnh vào cơ sở dữ liệu, tôi muốn đảm bảo thẻ tín dụng của họ hợp lệ và xử lý.

Như vậy, có thể lưu trữ tạm thời dữ liệu hình ảnh đó trong biến SESSION không?

Nếu không, làm cách nào để mọi người lưu trữ dữ liệu hình ảnh trên biểu mẫu trước khi cam kết dữ liệu đó?

Trả lời

29

Bạn có thể mong đợi việc sử dụng bộ nhớ của phiên của mình tăng tùy thuộc vào kích thước của hình ảnh. Để làm như vậy, bạn phải lưu nội dung tệp vào biến phiên.

Nếu dữ liệu trong phiên và bạn có nhiều bước sau khi tải lên, hình ảnh sẽ được tải lại (vào phiên) mỗi lần xem trang cho đến khi hoàn tất các bước.

Tôi khuyên bạn nên chống lại việc sử dụng phiên để giữ tệp nhị phân. Lưu hình ảnh trên đĩa vào một vị trí tạm thời cho đến khi đăng ký hoàn tất. Tôi sẽ chỉ lưu đường dẫn đến tệp tạm thời trong phiên. Khi transaciton được hoàn thành di chuyển nó đến một vị trí thích hợp và làm chèn db của bạn.

Ngoài ra, về bản chất, dữ liệu phiên được lưu trữ trên đĩa (hoặc db), do đó bạn cũng có thể lưu tệp hình ảnh một lần sau đó đưa ra lệnh di chuyển khi hoàn tất.

+2

Nếu đăng ký thất bại thì sao? Làm cách nào bạn biết hình ảnh nào cần xóa, vì đó có thể là hình ảnh liên quan đến một phiên bản php khác? – Burimi

0

Có, bạn có thể lưu trữ hình ảnh trong phiên PHP. Đưa nó vào PHP dưới dạng chuỗi (tức là dữ liệu nhị phân) và sau đó bạn có thể đặt nó trong phiên.

Bạn sẽ muốn nó chỉ lớn như cần thiết và bạn cần xóa nó ngay sau khi bạn không cần nó vì phần lớn thông tin trong phiên sẽ làm chậm quá trình khởi động phiên.

3

Khi tệp được tải lên, tệp được gán tên tạm thời trong mảng $ _FILES. Tôi không biết tuổi thọ chính xác của các tệp đó, nhưng bạn có thể có thể nắm bắt tên đó trong phiên và tắt cuộc gọi move_uploaded_file() cho đến sau khi CC được xác minh.

Hoặc bạn có thể thực hiện bước CC trước.

+0

Tất cả các tệp trong mảng $ _FILES đều bị xóa khi thực thi tập lệnh PHP kết thúc, tức là tất cả các tệp đã tải lên bị mất nếu bạn chưa chuyển chúng sang một số nơi khác. – Serg

9

Tôi muốn lưu tệp vào đĩa, thậm chí bạn có thể đặt tên tệp bằng cách sử dụng id phiên của người dùng. Sau đó, có thể có một số loại kịch bản làm sạch được chạy như một công việc cron và xóa các hình ảnh của những người không bao giờ thanh toán thành công.

Nếu bạn thử và lưu trữ hình ảnh trong phiên, bạn đang làm sai.

1

Đôi khi Chúng tôi cần xem trước/xác nhận trang trước khi lưu dữ liệu vào cơ sở dữ liệu. Nhưng tệp hình ảnh vào trang xác nhận có một chút khác biệt. Bạn không thể làm $_SESSION['s_name'] = $_FILES['f_name'] coz PHẦN CHỈ giữ tập tin văn bản. Theo cách khác, giữ nội dung tệp/giá trị nhị phân trong phiên.

$_SESSION['obj_image_session'] = file_get_contents($_FILES['image_name']['tmp_name']); 

$file= "new_file.jpg"; 
$fp=($file,"w"); 

fwrite($fp,$_SESSION['obj_image_session']); 
1

Nếu bạn phải giữ dữ liệu, tôi khuyên bạn nên giữ nó làm chuỗi base64_encoded.Bạn có thể trực tiếp gửi dữ liệu hình ảnh base64_encode tới trình duyệt.

Nếu tôi ở trong tình huống tương tự, tôi đã lưu hình ảnh và lưu thông tin về hình ảnh trong phiên/db. Nếu vì lý do nào đó, đăng ký không thành công, tôi sẽ hủy liên kết tệp sau. và đôi khi chạy các công việc cron để định vị các liên kết bị thiếu với các hình ảnh.

Nhưng tôi thực sự khuyên bạn nên chọn tùy chọn thứ hai và tránh những rắc rối hoàn toàn.

0

Bạn có thể lưu trữ dữ liệu hình ảnh trong phiên làm cơ sở mã hóa một cách dễ dàng. Trong máy chủ sản xuất, bạn có nghĩa vụ phải có đủ RAM. Ứng dụng của tôi cần tối đa 40MB 4 hình ảnh/ứng dụng để cập nhật và thay đổi trước khi đưa vào mongoDB. (mã hóa cơ sở làm cho kích thước hình ảnh 1,3 lần lớn hơn.)

$tmpNameSS1 = $_FILES["screenshot1"]["tmp_name"]; 
    $fp  = fopen($tmpNameSS1, 'r'); 
    $rawDataSS1 = fread($fp, filesize($tmpNameSS1)); 
    fclose($fp); 
    $SS1FileName = $_FILES["screenshot1"]["name"]; 
    $encodedSS1Data = base64_encode($rawDataSS1); 

    registry::update('sCreateSS1Name', $SS1FileName); 
    registry::update('sCreateSS1Data', $encodedSS1Data); 

Một trường hợp sẽ là: bạn có nhiều hình ảnh để tải lên và cả client và server xác nhận cho kích thước và loại. Tìm nạp nhanh hơn từ phiên. Sau khi đưa vào DB null biến giữ hình ảnh.

trình duyệt sẽ hiển thị cho thấy hình ảnh với:

<img src="data:image/;base64,<?php echo registry::get('sCreateSS1Data'); ?>"/> 

Bạn có thể cập nhật phiên cho hình ảnh với chuỗi rỗng sau khi mã đạt đến cuối khối. Trường hợp điển hình là cập nhật trường biểu mẫu có xác thực và khi người dùng muốn thay đổi văn bản. Bạn cũng muốn hiển thị hình ảnh nào được tải lên giữa những cập nhật không thành công đó. Nếu bạn muốn lưu chuyến đi khứ hồi (khuyến khích) hãy giữ dữ liệu trong một vài phút trong phiên và bỏ trống giá trị đó sau mã là về thoát.