2011-01-08 21 views
5

có vấn đề sau:làm cách nào để tạo tệp tải lên trong grails hoạt động với oracle?

Tôi đã cố gắng tạo chức năng tải lên tệp simpel trong grails. Tôi vừa tạo một lớp miền với một số điện thoại

byte[] rawFile 

làm tài sản. Grails đã làm phần lớn phần còn lại cho tôi. Nó làm việc tốt cho hsqldb tiêu chuẩn trong môi trường dev.

Sau đó, tôi đã triển khai nó lên máy chủ bằng một oracle db được định cấu hình (trình điều khiển mỏng). Mọi thứ nhưng tệp tải lên hoạt động tốt với db oracle. Đối với các tập tin tải lên tôi nhận được một (như xa như tôi có thể nhớ)

SQLException: ORA-01.461: có thể ràng buộc một giá trị DÀI chỉ nhằm chèn vào một DÀI

Tôi đã thử nhiều cách để giải quyết nó (bao gồm một số columnmappings để blobs và sử dụng java.sql.blob thay vì byte []) nhưng không có gì thực sự làm việc và tôi đã đi theo một hướng mà mã của tôi sẽ không được db độc lập nữa.

Google không thực sự giúp tôi và sách grails của tôi cũng không giúp ích gì.

Lưu tệp vào đĩa không phải là giải pháp tốt theo ý kiến ​​của tôi.

Vì vậy, đây là câu hỏi của tôi:

làm thế nào để tạo ra một tập tin tải lên trong grails mà làm việc với oracle?

Cập nhật: có thêm một số thông tin bổ sung. Được quản lý để tái tạo sự cố với XE-Edition của Oracle:

Hibernate tạo cột VARBINARY (255) cho rawFile. Vì vậy, tôi đã cố gắng tải lên một tệp 4 byte và nó hoạt động.

Sau đó tôi đã thay đổi loại cột theo cách thủ công thành 'blob' và nó hoạt động với các tệp lớn hơn.

sau đó tôi đã thêm

static mapping = { 
    columns { 
     rawFile type:'blob' 
    } 
} 

đến lớp miền của tôi và nó ngừng làm việc:

LỖI errors.GrailsExceptionResolver - [B không thể được đúc để java.sql.Blob java.lang. ClassCastException: [B không thể truyền sang java.sql.Blob

:-(

Trả lời

4

Thay vì thiết lập các kiểu để Blob cố gắng tăng các hạn chế MAXSIZE:

static constraints = { 
    rawFile(maxSize: 20 * 1024 * 1024) // 20 MBs 
    // ... 
} 
+0

Tuyệt vời! Có vẻ như đã làm các trick! – rdmueller

+0

Vì vậy, nó không phải là một giải pháp! Tôi đã có loại vấn đề như vậy và nếu tôi không thiết lập các loại lĩnh vực để blob, trong cơ sở dữ liệu oracle loại trường được thiết lập là LONG. Tôi tự hỏi làm thế nào có thể đây là câu trả lời được coi là một trong những giải pháp tốt và tốt. :) – emilan

1

Tôi không chắc chắn những gì bạn đang làm trong điều khiển của bạn, hãy thử làm nó bằng tay để xem những gì sẽ xảy ra:

request.fileMap.each { name, file -> 
    if (!file.empty) { 
     model.rawFile = file.bytes 
    } 
} 
model.save() 
+0

ý tưởng hay, nhưng không - không giải quyết được sự cố. – rdmueller

4

Nếu bạn muốn sử dụng trường Blob trong Oracle, hãy đặt thuộc tính miền của bạn thành byte [] và đặt loại thành org.hibernate.type.MaterializedBlobType.MaterializedBlobType xử lý chuyển đổi qua lại giữa Oracle (có lẽ là các cơ sở dữ liệu khác, nhưng tôi chỉ thực hiện điều này trên Oracle) và byte [].

byte[] blobFile 

static mapping = { 
    blobFile type: org.hibernate.type.MaterializedBlobType 
} 
+0

cũng hoạt động cho bưu chính, cảm ơn! –

1

Thử đặt sqlType.

Sử dụng trường tên miền với loại byte[] với sqlType đặt thành "blob" trong khối mapping hoạt động cho tôi bằng cách sử dụng Grails 2.3.1 và Oracle 11g. Grails xử lý việc chuyển đổi kiểu tự động.

class Image { 
    byte[] image 
    static mapping = { 
     image(sqlType: "blob") 
    } 
} 
Các vấn đề liên quan