Импорт файла (MultipartFile) и процесс - Java / Grails - PullRequest
1 голос
/ 01 марта 2012

Так что я пытаюсь сделать, как мне показалось, простой файл для чтения и импорта.Теперь мой код работает так, что я храню файл в папке на сервере, выбираю его и импортирую.Я выбираю файл через мультифайл:

    <g:form method="post"  enctype="multipart/form-data" controller="fileManager">
        <label>Company Name:</label><input id="cname" type="text" name="cname" /><br />
        <label>Select a CSV file to upload:</label> <input type="file" id="newFile" name="newFile" /> 
        <g:actionSubmit action="importContactsFromFile" value="Import" />
    </g:form>

Итак, что я хочу сделать:

  • Пользователь должен выбрать файл
  • Загрузить файл вкаталог на сервере (поток ввода / вывода?)
  • Считать содержимое файла (CSVReader) и импортировать в БД (это работает)
  • Возможно очистить файл после

Так что у меня сильная головная боль с этим вторым шагом.Я вытягиваю файл в переменную def:

def newFile = request.getFile('newFile')

Как мне преодолеть этот пробел?Хлопнув головой по этому поводу!Спасибо!

Ответы [ 3 ]

4 голосов
/ 01 марта 2012

Вам нужно сохранить файл как промежуточный этап перед его разбором? Большинство синтаксических анализаторов CSV (например, OpenCSV) будут читать непосредственно из Reader или InputStream. Таким образом, вы можете сделать что-то вроде:

def newFile = request.getFile('newFile')
def csv = new CSVReader(newFile.inputStream.newReader())
...

Если вы хотите сохранить файл, вы можете использовать метод transferTo:

def newFile = request.getFile('newFile')
newFile.transferTo(new File('newFile.csv'))
def csv = new CSVReader(new File('newFile.csv').newReader())

В этом случае вы должны убедиться, что два запроса не перезаписывают друг друга, обеспечивая уникальное имя файла.

Вы можете найти больше информации в руководстве по Grails: http://grails.org/doc/latest/guide/theWebLayer.html#6.1.9%20Uploading%20Files

1 голос
/ 01 марта 2012
// Import statement
import org.springframework.web.multipart.commons.CommonsMultipartFile;

в вашем методе контроллера:

CommonsMultipartFile f = params['newFile'];
if (f != null) {
   BufferedInputStream bis = new BufferedInputStream (f.getInputStream())
   // Do whatever you like.
}
0 голосов
/ 01 марта 2012

Взгляните на Загрузка документации GrailsFiles

Попробуйте:

def upload() {
def f = request.getFile('myFile')
f.transferTo(new File('/some/local/dir/myfile.txt'))
response.sendError(200, 'Done')

}

надеюсь, это поможет

...