سؤال

أريد تحميل صورة باستخدام Groovy على الشجاعة. صفحة GSP الخاصة بي هي كما يلي (أظهر نسخة مبسطة من الأصل)

<g:form controller="post" action="save" enctype="multipart/form-data">        
      My picture  <input type="file" name="myPicture" />     
    <g:submitButton name="submit" value="Save"/>
</g:form>

فئة المجال الخاصة بي هي كما يلي:

class Post {    

byte[] myPicture

static mapping = {
    myPicture type:  "blob" 
}

أحتاج إلى هذا التعيين، وإلا سيقوم MySQL بإنشاء SmallBlob وهو صغير لتناسب الصور

static constraints = {
    myPicture(nullable:false)      
}

}

عند وحدة التحكم لدي إجراء يسمى Save وهو ما يلي:

def save = {                               
    def post = loadPost(params.id)

    post.properties = params

    if(post.save()) {
        print "hallo world"             
        redirect(action:'list', params:params)
    } else {
        render(view:'edit', model:[post:post])
    }
}

يتم طرح الاستثناء عندما أحاول حفظ الصورة في DB.

2009-04-27 18:16:07,319 [20806951@qtp0-0] ERROR errors.GrailsExceptionResolver  - java.lang.ClassCastException: [B cannot be cast to java.sql.Blob

org.codehaus.groovy.runtime.invokerinvocationException: java.lang.classcastException: [B لا يمكن أن يلقي إلى java.sql.blob

أي تلميح لماذا هذا؟

راجع للشغل، لقد رأيت في برنامج تعليمي تم التعامل مع الصور كسلاسل لكنها لم تنجح كذلك.

هل كانت مفيدة؟

المحلول

جرب بهذه الطريقة:

  def save = {                               

    def post = loadPost(params.id)

    def f = request.getFile('myPicture')             

    post.myPicture = f.getBytes()
    post.pictureType = f.getContentType()                    


    if(post.save()) {

نصائح أخرى

لقد وجدت سؤالا مماثلا على Nabble:

http://www.nabble.com/mysql-and-blobs-td16116885.html

يتم اقتراح حلين ممكنين:

  • قم بتغيير قيود الخاصية Blob إلى حد كبير بحجم كبير، لإيقافها من استخدام "TinyBlob".
  • استخدم تطبيق Libernate Blob بدلا من البايت [] لإعلان نوع الخاصية. سيتطلب ذلك من دفق البيانات في Blob، بدلا من التعيين المباشر، ولكن النشر أعلاه يعطي التعليمات البرمجية للقيام بذلك.

يمكنك محاولة استخدام الربيع multipartfile. داخل الخاص بك loadPost() طريقة؟

هنا مثال من مستندات:

def upload = {
    def f = request.getFile('myFile')
    if(!f.empty) {
      f.transferTo( new File('/some/local/dir/myfile.txt') )
      response.sendError(200,'Done');
    }    
    else {
       flash.message = 'file cannot be empty'
       render(view:'uploadForm')
    }
}

أعتقد أنه يمكنك الوصول f.bytes مباشرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top