8

Tôi có ứng dụng rails 3.1 lưu trữ hình ảnh trong trường nhị phân trong cơ sở dữ liệu postgresql (Tôi biết vấn đề tiềm ẩn với lưu trữ hình ảnh trong cơ sở dữ liệu) cho bây giờ). Mọi thứ hoạt động tốt ở chế độ phát triển và thông số kỹ thuật trên OSX, nhưng tất cả các hình ảnh đều bị hỏng trong ứng dụng được triển khai cho Heroku. Tôi đã xác minh rằng dữ liệu trong cơ sở dữ liệu là chính xác bằng cách trỏ máy cục bộ của tôi vào cùng cơ sở dữ liệu mà cá thể heroku sử dụng và tất cả các hình ảnh được hiển thị chính xác.ActiveRecord tải trường nhị phân không chính xác trên Heroku, tốt trên OSX

Vì vậy, vấn đề dường như nằm trong ActiveRecord (chạy trên Heroku) tải dữ liệu từ cơ sở dữ liệu. Tôi cũng đoán nó là một vấn đề mã hóa. Chạy giao diện điều khiển đường ray cục bộ Tôi có thể xác minh rằng byteize của các trường này là chính xác, nhưng chạy bảng điều khiển đường ray trên Heroku cho thấy một byte không đúng. Trong thực tế, tải một tập tin N byte thông qua ActiveRecord trên Heroku kết quả trong một byteize của 2N + 1 cho tất cả các tập tin.

Bất kỳ trợ giúp nào được đánh giá cao.

+0

Loại cột là gì? –

+0

: nhị phân trong đường ray, bytea trong postgres. –

Trả lời

16

2n + 1 có mùi giống như bạn đang nhận được kết quả đầu ra hex từ bytea thay vì định dạng thoát cũ của bạn. Tôi đoán rằng bạn đang sử dụng một cơ sở dữ liệu chuyên dụng và đó có nghĩa là PostgreSQL 9.0 trong đó có một different default encoding for bytea:

Khi chuyển từ PostgeSQL 8.x để PostgreSQL 9.x bạn có thể chạy vào các vấn đề với khả năng tương thích chuỗi nhị phân. Biểu diễn mặc định là hex trong phiên bản 9 nhưng phiên bản 8 được thiết lập để thoát. Bạn có thể sử dụng PostgreSQL 9 để thoát bằng cách thiết lập bằng tay bytea_output.

Nếu tôi đúng thì bạn có thể sử dụng các hướng dẫn trong liên kết ở trên hoặc sử dụng phiên bản này tóm tắt:

  1. Trong kiểu dòng lệnh "Heroku cấu hình VAR" để có được thông tin chi tiết hệ thống của bạn .
  2. Trích xuất tên người dùng PostgreSQL từ DATABASE_URL của bạn trông giống như postgres://username:[email protected]/database_name.
  3. Sử dụng heroku pg:psql để nhận bảng điều khiển PostgreSQL.
  4. Thực thi ALTER ROLE username SET bytea_output TO 'escape'; từ bảng điều khiển psql, trong đó, tất nhiên, username là tên người dùng từ (1).
  5. Thoát psql làm heroku restart để khởi động lại ứng dụng của bạn.

Sau đó thử lại và hy vọng bạn sẽ nhận được đúng byte.

+0

Cảm ơn bạn! Tôi thực sự đọc tài liệu đó, nhưng nghĩ rằng nó không phải là vấn đề của tôi kể từ khi chỉ máy chủ rails dev cục bộ của tôi tại cùng một cơ sở dữ liệu (và sử dụng cùng một người dùng cơ sở dữ liệu) dẫn đến hình ảnh hoạt động. Đoán tôi vẫn không 100% grok nó, nhưng nó đã làm các trick. –

+0

Câu trả lời của thiên tài, cảm ơn! Điều này giải quyết vấn đề rất tương tự của tôi: http://stackoverflow.com/questions/12084414/binary-data-getting-borked-when-saving-to-postgresql – devth

+2

FYI, chúng tôi tại Heroku Postgres đã thực hiện điều này mặc định cho tất cả khởi động mới cơ sở dữ liệu tầng ('SET bytea_output TO 'escape''). Bạn có thể xác minh điều này bằng cách chạy 'select setting from pg_settings, nơi name = 'bytea_output';' – hgmnz

Các vấn đề liên quan