Rails 3 + скрепка + windows + проблема с кодировкой имени файла - PullRequest
0 голосов
/ 08 июня 2011

Я использую рельсы 3 и скрепка плагин для прикрепления файлов.

У меня есть две модели:

  • Заказать;
  • OrderAttachment:
    • принадлежит_ к: заказу;
    • has_attached_file: doc;

И я пытаюсь прикрепить файлы к заказу через скрепку;

Когда я прикрепляю файлы с английским или числовым именем файла все прекрасно работает :

  SQL (0.0ms)  INSERT INTO "order_attachments" ("order_id", "created_at", "updated_at",  "doc_file_name", "doc_content_type", "doc_file_size", "doc_updated_at") VALUES (1, '2011-06-08 11:07:22.108523', '2011-06-08 11:07:22.108523', 'Example.txt', 'text/plain', 22, '2011-06-08 11:07:22.105523') RETURNING "id"
[paperclip] Saving attachments.
[paperclip] saving D:/my_project_path/public/system/docs/93/original/Example.txt
  SQL (1.0ms)  COMMIT
Completed 200 OK in 229ms (Views: 21.0ms | ActiveRecord: 7.0ms)

Но когда я прикрепляю файлы с русским именем файла возникает ошибка :

SQL (1.0ms)  INSERT INTO "order_attachments" ("order_id", "created_at", "updated_at", "doc_file_name", "doc_content_type", "doc_file_size", "doc_updated_at") VALUES (1, '2011-06-08 11:26:43.040925', '2011-06-08 11:26:43.040925', 'Пример.txt', 'text/plain', 26, '2011-06-08 11:26:43.035924') RETURNING "id"
[paperclip] Saving attachments.
[paperclip] saving D:/my_project_path/public/system/docs/94/original/Пример.txt
  SQL (0.0ms)  ROLLBACK
Completed   in 161ms

Errno::ENOENT (No such file or directory - D:/my_project_path/public/system/docs/94/original/╨а╤Я╨б╨В╨а╤С╨а╤Ш╨а┬╡╨б╨В.txt):
  app/controllers/orders_controller.rb:138:in `attachment'

Скрепка сохраняет файл в D: /my_project_path/public/system/docs/94/original/Пример.txt (я могу открыть его через проводник), но запись в базе данных не создана . Возможно, что-то не так с кодировкой.

Я использую:

  • Windows 7 профессиональный x64;
  • PostgreSQL 9.0 (кодировка базы данных UTF-8);
  • Рубин 1.9.2;
  • Ruby on Rails 3.0.7;
  • Скрепка 2.3.11;

Спасибо за любую помощь.

1 Ответ

1 голос
/ 08 июня 2011

Как я уже сказал, скрепка сохраняет вложенный файл, а rails создает допустимый запрос, но что-то внутри источника скрепки не работает под Windows.

Errno :: ENOENT исключение обнаружено в C: \ Ruby192 \ lib \ ruby ​​\ gems \ 1.9.1 \ gems \ paperclip-2.3.11 \ lib \ paperclip \ storage \ filesystem .rb исходный файл в строке 42

def flush_writes #:nodoc:
  @queued_for_write.each do |style_name, file|
    file.close
    FileUtils.mkdir_p(File.dirname(path(style_name)))
    log("saving #{path(style_name)}")
    FileUtils.mv(file.path, path(style_name))
    FileUtils.chmod(0644, path(style_name))
  end
  @queued_for_write = {}
end

Я изменил эту функцию на:

def flush_writes #:nodoc:
  @queued_for_write.each do |style_name, file|
    file.close
    FileUtils.mkdir_p(File.dirname(path(style_name)))
    log("saving #{path(style_name)}")
    FileUtils.mv(file.path, path(style_name))
    begin
      FileUtils.chmod(0644, path(style_name))
    rescue Errno::ENOENT
      log("Errno::ENOENT caught on #{ENV['OS']}")
    end
  end
  @queued_for_write = {}
end

Это решение работает для меня. Теперь выходной файл журнала:

  SQL (1.0ms)  INSERT INTO "order_attachments" ("order_id", "created_at", "updated_at", "doc_file_name", "doc_content_type", "doc_file_size", "doc_updated_at") VALUES (14, '2011-06-08 18:44:25.853559', '2011-06-08 18:44:25.853559', 'Пример.doc', 'application/msword', 292352, '2011-06-08 18:44:25.727552') RETURNING "id"
[paperclip] Saving attachments.
[paperclip] saving D:/my_project_path/public/system/docs/199/original/Пример.doc
[paperclip] Errno::ENOENT caught on Windows_NT    --> !!! here it is - our exception !!!
  SQL (3.0ms)  COMMIT
Completed 200 OK in 287ms (Views: 13.0ms | ActiveRecord: 15.0ms)
...