2010-08-05 6 views
1

Grails 어플리케이션의 경우 연락처로 가득 찬 CSV 파일을 업로드하고 파일을 구문 분석하고 데이터에서 연락처를 생성하는 방법을 작성했습니다. 나는 자기 자신의 테스트 파일을 사용했다. (어떤 필드가 어떤 것인지를 하드 코딩하고있다.) 그것은 훌륭하게 작동한다.한 grails 액션에서 다른 grails 액션으로 데이터 전송하기

물론 필드 참조를 그렇게 하드 코딩 된 상태로 둘 수는 없으므로 다음 단계는 사용자에게 파일의 열을 데이터베이스 필드 (열 A와 B의 보류 위치)에 매핑하는 화면을 보여주는 것입니다. 이름 C 열에는 전자 메일 등이 있습니다).

내 질문 : 첫 번째 부분에서 추출한 데이터를 임시 저장하는 가장 좋은 방법은 무엇입니까? 따라서 두 번째 부분에서 사용할 수 있습니까? 도메인 클래스는 논리적 인 선택처럼 보일 수 있지만, 나는이 일을하는 우아한 방법을 찾지 못했습니다. Hibernate는 2D 문자열 배열을 좋아하지 않으며, OO 방식으로 구현하기 위해서는 여러 도메인 클래스 (ImportedCsv, CsvRow)가 필요합니다. 그렇게 작고 일시적인 프로세스를 위해 몇 가지 최상위 도메인 클래스를 가질 수 있습니까?

나는 약간의 grails 초보자 다. 그래서 나는 무엇이 hackish하고 우아한 지 잘 모르겠다. 너는 무엇을 할 것이냐?

+0

매핑 정보를 보존 할 필요가 없다면 왜 어디서 저장합니까? 매개 변수를 맵에 저장하면 데이터를 열에 매핑하는 방법을 알 수 있습니다. –

+0

예, CSV의 데이터를 저장하지 않으면 머리글을 추출하기 위해 한 번, 사용자의 선택에 따라 한 번 처리하기 위해 두 번 업로드하고 구문 분석해야합니다. 종류의 추한. –

답변

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 분 같은 시간 초과 기간이 있습니다. 사용자가 웹 응용 프로그램 사용을 중단하면 세션 시간이 초과되어 만료됩니다. 사용자가 애플리케이션을 완료 한 후에 데이터를 유지할 필요가 없다면 이는 아마도 가장 쉬운 방법 일 것입니다.

0

질문을 읽을 때 제일 먼저 들었던 점은 Grails Web Flows입니다. 이는 Spring Web Flow project을 기반으로하며 마법사 스타일의보기 시퀀스를 구현하기가 쉽습니다. 그것들을 상태 기계라고 생각하십시오. 흐름 범위를 사용하여 흐름의 "단계"사이에 상태를 저장할 수도 있습니다.

+0

흐름 범위는 세션 참조가있는 요청입니다. 이러한 스코프에 거대한 데이터를 저장하면 올바르게 정리되지 않으면 애플리케이션 성능이 저하됩니다. 나는 웹 흐름을 사용하는 것이 2 단계 작전을 위해 사용하는 것이 아주 과장된 것이라고 생각한다. – Sammyrulez

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()