1.Когда вы определяете store_dir
.. имя файла, кажется, NIL !!
Это кажется немедленной ошибкой - попробуйте оператор puts
, чтобы распечатать, какое имя файла установлено в..
Если имя файла NIL, вы увидите ошибку, которую видите:
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]
app/uploaders/image_uploader.rb:17:in `store_dir'
ПРИМЕЧАНИЕ:
вы переопределяете и имя файла и store_dir ... и используете имя файла внутри определения store_dir ... Здесь может быть проблема типа "курица и яйцо" ... лучше проверить это
store_dir должен быть просто каталогом, например, /somewhere/on/your/disk/images
filename должен быть просто именем файла без пути, например 24371592d9ea16625854ed68ac4b5846
или 24371592d9ea16625854ed68ac4b5846.jpg
например, проверьте, как эти два используются в коде в store.rb
(в конце ниже)
Вопрос:
с использованием filename[0,2]
- вы используетекаталоги с двухбуквенным префиксом суммы MD5 для хранения изображений?
2.Примечание: Что такое current_path
?? Кажется неправильным.Должен быть путь + имя файла, а не просто путь
3.Проверьте второй фрагмент кода (ниже) из store.rb
Похоже, вы установили store_dir
в относительную директорию - это очень хрупко и подвержено ошибкам .. может быть, лучше установитьэто абсолютный путь (начиная с '/')
4.Попробуйте установить имя файла и store_dir в константы для отладки
Так же, как проверка работоспособности, она работает, когда вы делаете это:
def store_dir
'/tmp/' # from the source code, it looks like this needs to start with '/' !!
end
def filename
'my_uploaded_file'
end
, которая должна работать перед установкой имени файла на сумму MD5..
Из исходного кода: (0.5.7)
lib / carrierwave / storage / file.rb
lib /carrierwave / uploader / store.rb
Вы можете переопределить CarrierWave :: Uploader :: Store # filename , чтобы указать имя файла по вашему выбору (см. исходный код):
Переопределение в CarrierWave :: Uploader :: Base должно работать, так как «Store» включен в «Base»;это переопределяет имя файла по умолчанию.
С store.rb
# Override this in your Uploader to change the filename.
#
# Be careful using record ids as filenames. If the filename is stored in the database
# the record id will be nil when the filename is set. Don't use record ids unless you
# understand this limitation.
#
# Do not use the version_name in the filename, as it will prevent versions from being
# loaded correctly.
#
# === Returns
#
# [String] a filename
#
def filename
@filename
end
Вы также можете проверить кэшированное имя файла, вычислить сумму MD5 (или лучше сумму SHA1 ), а затем используйте результат для именования файла.
С store.rb
# Calculates the path where the file should be stored. If +for_file+ is given, it will be
# used as the filename, otherwise +CarrierWave::Uploader#filename+ is assumed.
#
# === Parameters
#
# [for_file (String)] name of the file <optional>
#
# === Returns
#
# [String] the store path
#
def store_path(for_file=filename) # DEFAULT argument is filename - you don't need to override both
File.join([store_dir, full_filename(for_file)].compact)
end
Равенство файла:
files_equal?( filename1, filename2 )
return true if File.size(filename1) == File.size(filename2)
# return MD5(filename1) == MD5(filename2)
# as we assume that the filename == MD5 + some suffix :
return File.basename(filename1) == File.basename(filename2) # if names == MD5 are the same
end