2014-09-09 38 views
7

dışında bir MultipartRequest olsun ve ben göndermek için ayarlanmış yöntemle bir <g:uploadForm> var, ama benim denetleyicisi eylem bir MutlipartRequest alamıyorum nasıl. Bunun yerine, getFile() yöntemine sahip olmayan bir Servlet3SecurityContextHolderAwareRequestWrapper alıyorum. Döküm denedim, request.request ile sarmalayıcıdan istek almayı denedim ve benzer bir sorunla birlikte başkalarına önerdiğim bir sürü başka şeyi denedim, ama yine de zar yok. Eminim basit bir şey eksik. Bunu yapmaya eğilimliyim, ama eğer kimse bana doğru yönde işaret ederse çok minnettar olurdum. İşte Ben Grails 2.4.3 kullanıyorum bir Servlet3SecurityContextHolderAwareRequestWrapper

benim biçimi şöyledir:

<g:uploadForm method="POST" action="uploadSupplemental" > 
    <div class="modal-header"> 
     <h3 class="modal-title" id="myModalLabel">Upload Supplemental Data File</h3> 
    </div> 
    <div class="modal-body"> 
     <label for="fileInput">Choose file to upload:</label> 
     <input type="file" id="fileInput" name="supplementalData" /> 
    </div> 
    <div class="modal-footer"> 
     <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> 
     <input type="submit" class="btn btn-primary" /> 
    </div> 
    </g:uploadForm> 

Ve işte benim denetleyicisi eylem var: Burada

def uploadSupplemental() { 
    MultipartRequest multipartRequest = request as MultipartRequest 
    def file = multipartRequest.getFile('supplementalData') 
    if (file){ 
     flash.message = "File found!!" 
    } else { 
     flash.message = "File NOT found. :-(" 
    } 
    redirect action:'list' 
    } 

Ve hata alıyorum oluyor:

URI/app/yükleme/uploadSupplemental Sınıf groovy.lang.MissingMethodException Message Yöntem yok İmza: org.springfr amework.security.web.servletapi.HttpServlet3RequestFactory $ Servlet3SecurityContextHolderAwareRequestWrapper.getFile() değişken türleri için geçerli olan: (java.lang.String) değerleri: [supplementalData] olası çözümler: GetXml(), GetPart (java.lang.String), getAt (java.lang.String), getAt (java.lang.String), getLocale(), getJSON()

+0

Biraz daha bilgi: Ben isteği erişmek ilk kez benim denetleyicisi eylem içinde istek tiptedir: org.springframework.security.web.servletapi.HttpServlet3RequestFactory $ Servlet3SecurityContextHolderAwareRequestWrapper. Bunun için getRequest() öğesini çağırırsam, org.springframework.security.web.context.HttpSessionSecurityContextRepository $ Servlet3SaveToSessionRequestWrapper alırım. Hala bir sarıcı, bu yüzden bu konuda getRequest ve bir org.springframework.security.web.firewall.RequestWrapper, başka bir sarıcı olsun. (devamı ...) –

+0

Bir org.springframework.security.web.firewall.RequestWrapper.getRequest çağrısı, org.apache.catalina.core.ApplicationHttpRequest. Sonunda bir istek nesnesine sahibim, ama olması gereken MultipartRequest değil. Hala güldü. –

+0

'Config.groovy' içinde ayarlanmış grails.web.disable.multipart'ın değeri nedir? İşte ilgili [JIRA sorunu] (https://jira.grails.org/browse/GPSPRINGSECURITYCORE-191) ve bir SO [yinelenen soru] (http://stackoverflow.com/questions/21764419/grails-upload- aynı istisnayı bildiren dosya-imza-yöntem-getfile). Ayrıca, kullanıcının yükleme eyleminden önce doğrulandığından emin olun. Denetleyicide '@ Secure' kullanıldığından emin olun. – dmahapatro

cevap

2

aşağıdaki yapılandırma özelliği mümkün kılmak için Config.groovy içinde true için ayarlanmalıdır çok parçalı istekler. İşte

grails.web.disable.multipart=true 

aynı durum raporlama related JIRA issue ve a duplicate question in SO olduğunu. Ayrıca, yükleme işleminden önce kullanıcının (@Secured ile) doğrulandığından emin olun.

+1

Bu çözüm benim için çalışmıyor, ancak güvenli bir anonsa sahip değilim ama aynı zamanda HttpServlet3RequestFactory $ Servlet3SecurityContextHolderAwareRequestWrapper aldım. Bir fikir nasıl çözülür? Not: Yükleme masaüstü bilgisayarda çalışıyor, ancak mobil cihazlarda çalışmıyor – Mephiztopheles

0

benim grails uygulamada tam olarak aynı hata vardı ve şu çözüm geldi:

Uygulamamda isteği örneğinin tipi ulaşır HTTP sonrası içinde içerik türü özellik ile ilişkili olduğu sunucusu. Ben gibi set enctype özelliği olan bir form içinde bir dosya girişi ...

<form enctype="multipart/form-data" action="upload" method="POST"> 

olsaydı Yani, ... beklediğim ve request.getFile() çağırarak yüklenen dosyayı alabilir gibi bir MutlipartRequest aldık.

Ancak HTTP iletisinde bir "application/octet-stream" içerik türü varsa (tek bir dosyayı yüklemek için Valum'un AJAX Dosya Yükleme Aracı'nı kullandığımızda olduğu gibi), isteğin kendisi bir ikili dosyadır ve request.getInputStream() numaralı telefonu arayarak bir InputStream'e dönüştürülebilir.

Bu nedenle, uygulamanızda hangi içerik türünün kullanıldığından emin değilseniz, dosyayı doğrudan istek üzerine almak için, yangın topu gibi bir tarayıcı aracıyla kontrol etmenizi ve request.getInputStream()'u denemenizi öneririz.

See the diference between content-type and enctype

İlgili konular