2010-08-05 77 views
1

對於我們的grails應用程序,我編寫了一種方法,可以讓您上傳一個充滿聯繫人的CSV文件,並解析文件並創建聯繫人數據。我已經使用了自己的測試文件(硬編碼字段意味着什麼),並且效果很好。將數據從一個grails動作傳輸到另一個動作

但是當然,我不能像這樣硬編碼字段引用,所以我的下一步是向用戶顯示一個屏幕,讓他們將他們文件中的列映射到我們的數據庫字段(列A和B保存名稱,C列保存電子郵件等)。

我的問題:臨時存儲我在第一部分中提取的數據的最佳方式是什麼,所以它可以在第二部分結束時使用?一個領域類似乎是合乎邏輯的選擇,但我還沒有找到一個完美的方式來做到這一點。 Hibernate似乎不喜歡2D字符串數組,並且以OO方式實現它需要幾個域類(ImportedCsv,CsvRow)。對於這樣一個小而臨時的流程,有幾個頂級域名類可以接受嗎?

我是一個Grails新手,所以我不知道什麼是駭人的,什麼是優美的。你會怎麼做?

+0

如果你不需要保留映射信息,爲什麼把它存儲在任何地方? 將參數保存在地圖中,以便您知道如何將數據映射到列。 – 2010-08-05 19:10:02

+0

是的,但是如果我們不存儲CSV的數據,我們必須上傳並解析它兩次:一次提取標題,一次用用戶的選擇處理它。有點醜。 – 2010-08-05 19:16:33

回答

1
upload the file in the first action 
store a blob in db 
parse the columns out display ui to map column to fields 
second action read the blob from db, create new domain objects, delete blob from db 

我認爲在會話中存儲csv文件可能會導致一些問題。

0

將數據存儲在會話對象中。您可以在會話中存儲大多數任意數據,例如字符串數組或散列圖。只要用戶正在使用網絡應用程序,並且超時時間大約爲30分鐘,則會持續一段時間,但這可以根據需要增加或減少。一旦用戶停止使用Web應用程序,會話將超時並過期。如果在用戶完成應用程序後不需要保存數據,這可能是最簡單的方法。

0

在閱讀您的問題時首先想到的是Grails Web Flows。這些都是基於Spring Web Flow project,並且可以很容易地實現嚮導式視圖序列。把它們想象成一個狀態機。您還可以使用流量範圍在流程中的「步驟」之間保存狀態。

+0

流程作用域是具有會話參考的請求。在這些範圍內保存大量數據會在應用程序性能得不到保證的情況下導致性能下降。我認爲使用網絡流量只需要兩步操作是相當耗費時間的 – Sammyrulez 2010-08-06 07:17:10

0

我同意Aaron Saunders的看法,並說你應該將它存儲在數據庫中。這將允許您保存用戶狀態,以防會話超時。

使用多部分的形式上傳的文件,然後讓出該文件是這樣的:

def uploadedFile = request.getFile('image') 
csvDomainInstance.csvFile = uploadedFile.bytes 

你的域對象可能是這樣的:

class ContactCsvFile { 
    byte[] csvFile 
    static constraints = { 
    csvFile(nullable:true, maxSize:2097152) //2MB 
    } 
} 

然後讀出來,做這樣的事情(未經測試):

def file = new File() 
file.setBytes(csvDomainInstance.csvFile) 
def csvText = file.getText() 
相關問題