/** * Maintenance function to move attachments from one directory to another */ public function action_transfer() { global $modSettings, $txt; checkSession(); // We will need the functions from here require_once SUBSDIR . '/Attachments.subs.php'; require_once SUBSDIR . '/ManageAttachments.subs.php'; // The list(s) of directory's that are available. $modSettings['attachmentUploadDir'] = unserialize($modSettings['attachmentUploadDir']); if (!empty($modSettings['attachment_basedirectories'])) { $modSettings['attachment_basedirectories'] = unserialize($modSettings['attachment_basedirectories']); } else { $modSettings['basedirectory_for_attachments'] = array(); } // Clean the inputs $_POST['from'] = (int) $_POST['from']; $_POST['auto'] = !empty($_POST['auto']) ? (int) $_POST['auto'] : 0; $_POST['to'] = (int) $_POST['to']; $start = !empty($_POST['empty_it']) ? 0 : $modSettings['attachmentDirFileLimit']; $_SESSION['checked'] = !empty($_POST['empty_it']) ? true : false; // Prepare for the moving $limit = 501; $results = array(); $dir_files = 0; $current_progress = 0; $total_moved = 0; $total_not_moved = 0; // Need to know where we are moving things from if (empty($_POST['from']) || empty($_POST['auto']) && empty($_POST['to'])) { $results[] = $txt['attachment_transfer_no_dir']; } // Same location, that's easy if ($_POST['from'] == $_POST['to']) { $results[] = $txt['attachment_transfer_same_dir']; } // No errors so determine how many we may have to move if (empty($results)) { // Get the total file count for the progress bar. $total_progress = getFolderAttachmentCount($_POST['from']); $total_progress -= $start; if ($total_progress < 1) { $results[] = $txt['attachment_transfer_no_find']; } } // Nothing to move (no files in source or below the max limit) if (empty($results)) { // Moving them automaticaly? if (!empty($_POST['auto'])) { $modSettings['automanage_attachments'] = 1; // Create sub directroys off the root or from an attachment directory? $modSettings['use_subdirectories_for_attachments'] = $_POST['auto'] == -1 ? 0 : 1; $modSettings['basedirectory_for_attachments'] = $_POST['auto'] > 0 ? $modSettings['attachmentUploadDir'][$_POST['auto']] : $modSettings['basedirectory_for_attachments']; // Finaly, where do they need to go automanage_attachments_check_directory(); $new_dir = $modSettings['currentAttachmentUploadDir']; } else { $new_dir = $_POST['to']; } $modSettings['currentAttachmentUploadDir'] = $new_dir; $break = false; while ($break === false) { @set_time_limit(300); if (function_exists('apache_reset_timeout')) { @apache_reset_timeout(); } // If limits are set, get the file count and size for the destination folder if ($dir_files <= 0 && (!empty($modSettings['attachmentDirSizeLimit']) || !empty($modSettings['attachmentDirFileLimit']))) { $current_dir = attachDirProperties($new_dir); $dir_files = $current_dir['files']; $dir_size = $current_dir['size']; } // Find some attachments to move list($tomove_count, $tomove) = findAttachmentsToMove($_POST['from'], $start, $limit); // Nothing found to move if ($tomove_count === 0) { if (empty($current_progress)) { $results[] = $txt['attachment_transfer_no_find']; } break; } // No more to move after this batch then set the finished flag. if ($tomove_count < $limit) { $break = true; } // Move them $moved = array(); foreach ($tomove as $row) { $source = getAttachmentFilename($row['filename'], $row['id_attach'], $row['id_folder'], false, $row['file_hash']); $dest = $modSettings['attachmentUploadDir'][$new_dir] . '/' . basename($source); // Size and file count check if (!empty($modSettings['attachmentDirSizeLimit']) || !empty($modSettings['attachmentDirFileLimit'])) { $dir_files++; $dir_size += !empty($row['size']) ? $row['size'] : filesize($source); // If we've reached a directory limit. Do something if we are in auto mode, otherwise set an error. if (!empty($modSettings['attachmentDirSizeLimit']) && $dir_size > $modSettings['attachmentDirSizeLimit'] * 1024 || !empty($modSettings['attachmentDirFileLimit']) && $dir_files > $modSettings['attachmentDirFileLimit']) { // Since we're in auto mode. Create a new folder and reset the counters. if (!empty($_POST['auto'])) { automanage_attachments_by_space(); $results[] = sprintf($txt['attachments_transfered'], $total_moved, $modSettings['attachmentUploadDir'][$new_dir]); if (!empty($total_not_moved)) { $results[] = sprintf($txt['attachments_not_transfered'], $total_not_moved); } $dir_files = 0; $total_moved = 0; $total_not_moved = 0; $break = false; break; } else { $results[] = $txt['attachment_transfer_no_room']; $break = true; break; } } } // Actually move the file if (@rename($source, $dest)) { $total_moved++; $current_progress++; $moved[] = $row['id_attach']; } else { $total_not_moved++; } } // Update the database to reflect the new file location if (!empty($moved)) { moveAttachments($moved, $new_dir); } $new_dir = $modSettings['currentAttachmentUploadDir']; // Create / update the progress bar. // @todo why was this done this way? if (!$break) { $percent_done = min(round($current_progress / $total_progress * 100, 0), 100); $prog_bar = ' <div class="progress_bar"> <div class="full_bar">' . $percent_done . '%</div> <div class="green_percent" style="width: ' . $percent_done . '%;"> </div> </div>'; // Write it to a file so it can be displayed $fp = fopen(BOARDDIR . '/progress.php', 'w'); fwrite($fp, $prog_bar); fclose($fp); usleep(500000); } } $results[] = sprintf($txt['attachments_transfered'], $total_moved, $modSettings['attachmentUploadDir'][$new_dir]); if (!empty($total_not_moved)) { $results[] = sprintf($txt['attachments_not_transfered'], $total_not_moved); } } // All done, time to clean up $_SESSION['results'] = $results; if (file_exists(BOARDDIR . '/progress.php')) { unlink(BOARDDIR . '/progress.php'); } redirectexit('action=admin;area=manageattachments;sa=maintenance#transfer'); }
/** * Get files and size from the current attachments dir * * @package Attachments */ function currentAttachDirProperties() { global $modSettings; return attachDirProperties($modSettings['currentAttachmentUploadDir']); }