2011-06-08 28 views
0

我用rails 3回形針插件來附加文件。Rails 3 +回形針+ windows +文件名編碼問題

我有兩個型號:

  • 訂單;
  • OrderAttachment:
    • belongs_to:order;
    • 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專業版64位;
  • PostgreSQL 9.0(UTF-8數據庫編碼);
  • Ruby 1.9.2;
  • Ruby on Rails 3.0.7;
  • 回形針2.3.11;

感謝您的幫助。

+0

從 'Пример.txt' 到 「╨а╤Я╨б╨В╨а╤С╨а╤Ш╨а┬╡╨б╨В.txt」»絕對是一個編碼問題。 – pduersteler 2011-06-08 12:07:48

回答

1

正如我所說的回形針保存附加的文件和鋼軌創建有效的請求,但回形針源內的東西變得窗口下的Windows。

變量Errno :: ENOENT異常被夾在C:\ Ruby192 \ LIB \紅寶石\寶石\ 1.9.1 \寶石\回形針-2.3.11 \ LIB \回形針\存儲\ 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)