对于我们的grails应用程序,我编写了一个方法,允许您上传完整联系人的CSV文件,它将解析文件并从数据中创建联系人。我已经使用了我自己的测试文件(硬编码哪些字段意味着什么)并且效果很好。
但当然我不能让字段引用像这样硬编码,所以我的下一步是向用户显示一个屏幕,让他们将文件中的列映射到我们的数据库字段(列A和B保存名称) ,C栏保存电子邮件等。)
我的问题:暂时存储我在第一部分提取的数据的最佳方法是什么,所以它可以在第二部分结束时使用?域类似乎是合乎逻辑的选择,但我还没有找到一种优雅的方法来完成这一任务。 Hibernate似乎并不喜欢2D字符串数组,并且以OO方式实现它需要几个域类(ImportedCsv,CsvRow)。对于如此小的临时过程,有多个顶级域类可以接受吗?
我是一个grails新手,所以我不确定什么是hackish,什么是优雅。你会做什么?
答案 0 :(得分: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文件可能会导致一些问题。
答案 1 :(得分:0)
将数据存储在会话对象中。您可以在会话中存储大多数任意数据,例如字符串数组或哈希映射。只要用户使用Web应用程序的超时时间为30分钟,它就会持续,尽管可以根据需要增加或减少。一旦用户停止使用Web应用程序,会话将超时并过期。如果您在用户完成应用程序后不需要保留数据,这可能是最简单的方法。
答案 2 :(得分:0)
阅读问题时首先想到的是Grails Web Flows。它们基于Spring Web Flow project,可以很容易地实现向导式视图序列。将它们视为状态机。您还可以使用流量范围在流中的“步骤”之间保存状态。
答案 3 :(得分: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()