Проблема с вложениями ("Извините, такой файл уже существует")

Автор Roman, 02 апреля 2011, 17:41:37

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Roman

Исходные данные: SMF 1.1.13. Несколько тысяч вложенных в сообщения файлов (почти все — картинки)

Суть проблемы: По каким-то причинам движок не дает грузить во вложения файлы с именами, которые уже были загружены ранее. Не смотря на то, что на сервере файлы хранятся с именами в измененном виде (то есть, например, 7277_8ab00b82b5e18faa006fd8ad0dca410cfe7).
А именно, при попытке загрузки файла, выдается:
"Извините, такой файл уже существует. Пожалуйста, переименуйте файл и попробуйте снова."

Поскольку, вложений накопилось уже много, сейчас это стало доставлять ощутимые сложности пользователям.

Дополнительно все осложняется тем, что после такого сообщения с ошибкой есть кнопочка "назад", представляющая из себя javascript:history.go(-1). И когда человек нажимает ее, переименовывает файл, и пытается отправить сообщение повторно, выдается новая ошибка:
"Вы уже отправили это сообщение! Возможно, Вы случайно нажали дважды или пытались обновить страницу."

Это окончательно запутывает человека, не знакомого с логикой работы системы)) Многие после этого просто бросают попытки что-либо грузить:)

Еще одна сложность: если вложений в сообщении несколько, и выдается ошибка "такой файл уже существует", либо ошибка, связанная с превышением допустимого размера файла, то никак не указывается, какой именно файл вызвал данную проблему. И пользователю приходится переименовывать все файлы, или искать, какой именно файл не прошел по размеру.

Вопрос 1 (основной). Что и как можно сделать, чтобы можно было загружать файлы с одинаковыми именами? Ведь на сервере они хранятся под уникальными именами. Теоретически решение должно быть простое. Где ковырять?

Вопрос 2 (дополнительный). Как можно "цивилизовать" процесс загрузки? Чтобы было понятно, какой именно файл вызвал проблему. В идеале, чтобы сканирование файла происходило на лету, и например, если его размер превышает допустимый, это сразу бы отображалось. (про мод ресайза картинок знаю, но по определённым причинам, сейчас не хочу его использовать).

Roman

Итак, после некоторого изучения, удалось устранить проблему. Возможно, кому-то еще пригодится.
Все оказалось довольно просто.

Как известно, в более ранних версиях SMF, в настройках "Свойства вложений" присутствовал пункт "Шифровать имена закаченных файлов". Потом, из какого-то релиза эту настройку убрали, а шифрование файлов сделали по умолчанию. Однако, у тех, у кого эта настройка была изначально отключена, при загрузке файла с существующем именем, продолжает появляться ошибка "Извините, такой файл уже существует. Пожалуйста, переименуйте файл и попробуйте снова.", несмотря на фактическую шифровку имен файлов. Вот такой баг, или фича:) Вобщем, грабли для тех, кто в свое время поковырялся в настройках без оглядки на перспективу)

Соответственно, для решения проблемы, нужно всего лишь поменять эту древнюю настройку.

Как это сделать.

Способ 1.
Идем в базу данных своего форума с помощью, например, phpMyAdmin.
Находим там таблицу smf_settings. Заходим в нее.
Находим в ней строку attachmentEncryptFilenames. И видим, что в значении этой строки стоит "0".
Как раз в этом и заключается проблема. Соответственно, редактируем значение этой строки, меняя его на "1", и сохраняя.
Все)

Способ 2. (более муторный, но может кому-то так удобнее, мало ли:)
Потребуется отредактировать 2 файла:
- ManageAttachments.template.php (расположен в Themes/default)
- ManageAttachments.php (расположен в Sources)

Перед редактированием, естественно, сделайте резервные копии оригиналов.

В ManageAttachments.template.php находим строки:
</tr><tr class="windowbg2">
<td width="50%" align="right"><label for="attachmentExtensions">', $txt['attachmentExtensions'], '</label>:</td>
<td><input type="text" name="attachmentExtensions" id="attachmentExtensions" value="', $modSettings['attachmentExtensions'], '" size="40" /></td>
</tr>


и после них добавляем:
<tr class="windowbg2">
<td width="50%" align="right"><label for="attachmentEncryptFilenames">', $txt['attachmentEncryptFilenames'], ' <a href="', $scripturl, '?action=helpadmin;help=attachmentEncryptFilenames" onclick="return reqWin(this.href);" class="help">(?)</a>:</label></td>
<td><input type="checkbox" name="attachmentEncryptFilenames" id="attachmentEncryptFilenames" value="1" class="check"', empty($modSettings['attachmentEncryptFilenames']) ? '' : ' checked="checked"', ' /></td>
</tr>


В ManageAttachments.php находим строку:
'attachmentExtensions' => $_POST['attachmentExtensions'],

и после нее добавляем:
'attachmentEncryptFilenames' => empty($_POST['attachmentEncryptFilenames']) ? '0' '1',

Тем самым, мы вернули в админку настройку шифрования имен файлов. Соответственно, далее идем в "Свойства вложений",  и ставим галочку на пункте "Шифровать имена закаченных файлов". Все.
После этого действа можно вернуть на место оригиналы файлов ManageAttachments.template.php и  ManageAttachments.php. Так как повторно менять эту настройку вам вряд ли потребуется)


p.s. а вопрос №2 по прежнему актуален. Хотя, уже и не так сильно, после устранения описанных сложностей:)