2012-09-12 30 views
2

我創建了一個瀏覽按鈕讓用戶選擇一個文件,然後當他們點擊上傳按鈕時,它應該在控制器中激發該功能。將CSV文件和解析數據上傳到Grails中的數組?

我已經設置了視圖和控制器的空功能,我一直在尋找「Grails CSV Plugin」,以幫助解析文件,但從使用信息我似乎無法掌握如何我可以得到這個CSV數據到一個陣列?

可以any1請幫助我嗎?在此先感謝

這是我的控制器,它基本上是空的:

package com.smstool 

import org.springframework.dao.DataIntegrityViolationException 

class UploadController { 

    def index() { 
     redirect(action: "upload", params: params) 
    } 

    def upload() { 

     } 

} 

而我的觀點簡單地包含這種形式:

<g:form action="upload" method="post" enctype="multipart/form-data"> 
      <label for="file">File:</label> 
      <input type="file" name="file" id="file"/> 
      <input class="save" type="submit" value="Upload"/> 
     </g:form> 

我只是在控制器嘗試這樣做:

@Grab('com.xlson.groovycsv:groovycsv:1.0') 
import static com.xlson.groovycsv.CsvParser.parseCsv 

import org.springframework.dao.DataIntegrityViolationException 

class UploadController { 

    def index() { 
     redirect(action: "upload", params: params) 
    } 

    def upload() { 


     } 


    def batchUpload() { 

      def csv = new File('file') 

      //def csv = '''Name,Lastname 
      //Mark,Andersson 
      //Pete,Hansen''' 

      def data = parseCsv(csv) 

      for(line in data) { 
       println "$line.Number" 
      } 
    } 



} 

這不起作用,因爲我得到以下錯誤,任何想法?

Error 500: Internal Server Error 

URI 
    /upload/batchUpload 
Class 
    groovy.lang.MissingMethodException 
Message 
    No signature of method: static com.xlson.groovycsv.CsvParser.parseCsv() is applicable for argument types: (java.io.File) values: [file] Possible solutions: parseCsv(java.io.Reader), parseCsv(java.lang.String), parseCsv(java.util.Map, java.io.Reader), parseCsv(java.util.Map, java.lang.String), parse(java.io.Reader), parse(java.lang.String) 

Around line 28 of grails-app/controllers/com/tool/UploadController.groovy 

25:   //Mark,Andersson26:   //Pete,Hansen'''27:   28:   def data = parseCsv(csv)29:   30:   for(line in data) {31:    println "$line.Number" 

Around line 195 of PageFragmentCachingFilter.java 

192:   if (CollectionUtils.isEmpty(cacheOperations)) {193:    log.debug("No cacheable annotation found for {}:{} {}",194:      new Object[] { request.getMethod(), request.getRequestURI(), getContext() });195:    chain.doFilter(request, response);196:    return;197:   }198: 

Around line 63 of AbstractFilter.java 

60:  try {61:   // NO_FILTER set for RequestDispatcher forwards to avoid double gzipping62:   if (filterNotDisabled(request)) {63:    doFilter(request, response, chain);64:   }65:   else {66:    chain.doFilter(req, res); 

Trace 

    Line | Method 
->> 28 | batchUpload in UploadController.groovy 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 195 | doFilter in PageFragmentCachingFilter.java 
|  63 | doFilter . in AbstractFilter.java 
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor 
| 603 | run . . . . in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 679 | run   in java.lang.Thread 
+0

您可以發佈一些代碼? –

回答

3

查看:

<g:uploadForm action="upload"> 
    <input type="file" name="file"> 
    <g:submitButton name="upload" value="Upload"/> 
</g:uploadForm> 

控制器,安裝Grails的CSV插件:

def upload() { 
    def file = request.getFile('file') 
    def allLines = file.inputStream.toCsvReader().readAll() 
    ... 
} 
+0

這確實有效,信息已經存儲。我有3行數據與標題,我只需要獲取1行的數據並將其存儲到一個數組中,我怎麼能做到這一點?謝謝 – user723858

+0

任何人都可以請幫助嗎? – user723858

0

要讀一個單一的線或第一行:

def upload() { 
    def file = request.getFile('file') 
    def aLine = file.inputStream.toCsvReader().readNext() 
    ... 
}