2014-12-19 5 views
2

Я пытаюсь отправить файл в формате multipart/form-data.Scala encode multipart/form-data body

Моя проблема заключается в том, что содержимое файла на стороне сервера (в моем случае PHP) вдвое больше, чем ожидалось.

Как преобразовать данные?

Мой код

val boundary = randomBoundary 

val CrLf = "\r\n" 
val body = (
    for (fileInfo ← files) 
    yield s"--$boundary${CrLf}Content-Disposition: form-data; name=AttachedFile1; filename=${fileInfo.fileName}$CrLf$CrLf" + 
    s"Content-Type: application/octet-stream$CrLf$CrLf" + 
    new String(fileInfo.data) // fileInfo.data has type Array[Byte] 
).mkString(CrLf) + s"$CrLf--$boundary--" 
+1

Попробуйте расставить библиотеку, а не обработать ее вручную. – bkowalikpl

+0

@bkowalikpl Вы можете посоветовать такую ​​библиотеку? – alexkvak

+0

@alexkvak они означают буквально библиотеку, называемую «отправка». – lmm

ответ

0

Не используйте Струны для отправки двоичных данных; Строки - это кодированные символы UTF-8 на JVM.

Вы хотите получить Array[Byte], который легко испускается (на целевой сервер) любым java.io.OutputStream.

0

Я нашел ответ!

class DispatchTest extends FunSpec { 

    import dispatch.classic./\ 
    import dispatch.classic.mime.Mime.MimeRequestTerms 
    import dispatch.classic._ 

    val fi = new File("/Users/alexkvak/kr1.jpg") 
    val fileContent = Files.readAllBytes(fi.toPath) 

    val multiPart = new MimeRequestTerms(/\) <<*("party-file", "FileName.jpg", fileContent) 

    // some post data 
    multiPart << Map("fieldName" → "fieldValue") 

    val r = multiPart.copy(host = new HttpHost("localhost"), path = "/upload.php") 

    Http(r as_str)  
}  
Смежные вопросы