0

Я пытаюсь загрузить файл .csv с помощью ng-file-upload в браузере и для Play для Scala 2.5.x на бэкэнд.Загрузка файла из Angular ng-file-upload в Play для Scala

Если я использую moveTo в Play файл загружен, но генерироваться с заголовками и прицепами вместо простого файла:

request.body.moveTo(new File("c:\\tmp\\uploaded\\filetest.csv")) 

есть способ сохранить только часть данных?

Кроме того, я попытался следующий

def doUpload = Action(parse.multipartFormData) { request => 


    println(request.contentType.get) 
    println(request.body) 

    request.body.file("file").map { file => 
     val filename = file.filename 
     val contentType = file.contentType 
     file.ref.moveTo(new File("c:\\tmp\\uploaded\\filetest.csv")) 
    } 

    Ok("file uploaded at " + new java.util.Date()) 

} 

Но карта пуста. Это то, что я получаю в первых двух println утверждений:

многочастных/form-данных MultipartFormData (Map(), Vector (FilePart (файл, hello2.csv, некоторые (применение/vnd.ms-Excel) , TemporaryFile (C: \ Users \ Busine ~ 1 \ AppData \ Local \ Temp \ playtemp2236977636541678879 \ multipartBody2268668511935303172asTemporaryFile))), Vector())

это означает, что я получаю что-то, но я не могу извлечь его. Есть идеи?

ответ

1

Немного подробный, возможно, но он делает то, что вы хотите.
Обратите внимание, что я нахожусь на Mac, поэтому вам, возможно, придется изменить путь /tmp/uploaded/ в copyFile, так как он выглядит так, как будто вы на Windows.

package controllers 

import java.io.File 
import java.nio.file.attribute.PosixFilePermission._ 
import java.nio.file.attribute.PosixFilePermissions 
import java.nio.file.{Files, Path} 
import java.util 
import javax.inject._ 

import akka.stream.IOResult 
import akka.stream.scaladsl._ 
import akka.util.ByteString 
import play.api._ 
import play.api.data.Form 
import play.api.data.Forms._ 
import play.api.i18n.MessagesApi 
import play.api.libs.streams._ 
import play.api.mvc.MultipartFormData.FilePart 
import play.api.mvc._ 
import play.core.parsers.Multipart.FileInfo 

import scala.concurrent.Future 
import java.nio.file.StandardCopyOption._ 
import java.nio.file.Paths 

case class FormData(filename: String) 

// Type for multipart body parser  
type FilePartHandler[A] = FileInfo => Accumulator[ByteString, FilePart[A]] 

val form = Form(mapping("file" -> text)(FormData.apply)(FormData.unapply)) 

private def deleteTempFile(file: File) = Files.deleteIfExists(file.toPath) 

// Copies temp file to your loc with provided name 
private def copyFile(file: File, name: String) = 
    Files.copy(file.toPath(), Paths.get("/tmp/uploaded/", ("copy_" + name)), REPLACE_EXISTING) 

// FilePartHandler which returns a File, rather than Play's TemporaryFile class 
private def handleFilePartAsFile: FilePartHandler[File] = { 
    case FileInfo(partName, filename, contentType) => 
     val attr = PosixFilePermissions.asFileAttribute(util.EnumSet.of(OWNER_READ, OWNER_WRITE)) 
     val path: Path = Files.createTempFile("multipartBody", "tempFile", attr) 
     val file = path.toFile 
     val fileSink: Sink[ByteString, Future[IOResult]] = FileIO.toPath(file.toPath()) 
     val accumulator: Accumulator[ByteString, IOResult] = Accumulator(fileSink) 
     accumulator.map { 
     case IOResult(count, status) => 
      FilePart(partName, filename, contentType, file) 
     } (play.api.libs.concurrent.Execution.defaultContext) 
    } 

// The action 
def doUpload = Action(parse.multipartFormData(handleFilePartAsFile)) { implicit request => 
    val fileOption = request.body.file("file").map { 
     case FilePart(key, filename, contentType, file) => 
     val copy = copyFile(file, filename) 
     val deleted = deleteTempFile(file) // delete original uploaded file after we have 
     copy 
    } 
    Ok(s"Uploaded: ${fileOption}") 
} 
+0

вы можете добавить импорт? спасибо – ps0604

+0

Я получаю эту ошибку при загрузке файла (помню, я работаю в Windows):'play.api.http.HttpErrorHandlerExceptions $$ anon $ 1: Execution exception [[UnsupportedOperationException: 'posix: permissions' не поддерживается как начальный attribute]] ' – ps0604

+1

Я исправил это удаление переменной attr: val path: Path = Files.createTempFile ("multipartBody", "tempFile"), затем он работал – ps0604