1、从mongodb的数据实体Document中获取其中一个字段的值,即例如:doc.getString("pid"),直接显示value。
2、当从网络上的网址url的图片直接弄到数据库内,即用流。期待输入的request的entity是byte,即存入数据库内的图片是byte。
3、读取和上传的两种方式:
- 读取图片。
- 上传图片的字节流byte。
(get & parameters('pid, 'seqno.as[Int].?, 'width.as[Int].?, 'height.as[Int].?, 'bson.?)) { (pid, optSeq, optWid, optHght, bson) => if(bson==None && optSeq==None){ val futPicRow: Future[(Document, Seq[Document])] = for { picInfo <- repository.getPicBlob1(pid).toFuture[Document] picBlog <- repository.query2(equal("pid", pid)).toFuture[Seq[Document]] } yield (picInfo, picBlog) onComplete(futPicRow) { case Success(infoModelAndBlobDoc) => println("Success") val blob = if(infoModelAndBlobDoc._1==null) { if(infoModelAndBlobDoc._2==Seq()) None else mgoGetBlobOrNone(infoModelAndBlobDoc._2.head,"pic") }else mgoGetBlobOrNone(infoModelAndBlobDoc._1,"pic") if (blob != None) { withoutSizeLimit { encodeResponseWith(Gzip) { complete( HttpEntity( ContentTypes.`application/octet-stream`, ByteArrayToSource(Imaging.setImageSize(blob.get.getData, optWid.getOrElse(128), optHght.getOrElse(128)) )) ) } } } else complete(StatusCodes.NotFound) case Failure(err) => println("失败路线!!!!!") complete(err) } }else{ val futPicRow:Future[Document]= if (bson == None) repository.getPicBlob(pid, optSeq.get).toFuture[Document] //pid+序列号 else repository.getPicBlob2(pid, bson.getOrElse("{}")).toFuture[Document] //bson onComplete(futPicRow) { case Success(infoModelAndBlobDoc) => println("Success") val blob = if (infoModelAndBlobDoc==null) None else mgoGetBlobOrNone(infoModelAndBlobDoc,"pic") if (blob != None) { withoutSizeLimit { encodeResponseWith(Gzip) { complete( HttpEntity( ContentTypes.`application/octet-stream`, ByteArrayToSource(Imaging.setImageSize(blob.get.getData, optWid.getOrElse(128), optHght.getOrElse(128)) )) ) } } } else complete(StatusCodes.NotFound) case Failure(err) => println("失败路线!!!!!") complete(err) } } } ~
(post & parameters('pid, 'bson.?, 'picUrl)) { (pid, bson, picUrl) => val dlRequest = HttpRequest( HttpMethods.GET, uri = s"$picUrl" ) val futUrl: Future[HttpResponse] = Http().singleRequest(dlRequest) val b = Await.result(futUrl, 3 seconds).entity val futBytes =b.withoutSizeLimit.dataBytes.runFold(ByteString()) { case (hd, bs) => hd ++ bs } val filte=Document(bson.getOrElse("{}")) val futmsg: Future[Completed] = for { maxSeqno <- repository.query1(equal("pid",pid)).toFuture[Seq[Document]] bytes <- futBytes d= if(maxSeqno==Seq()) 0 else maxSeqno.head.getInteger("seqno")+1 docs = filte + ("pid" -> pid, "seqno" -> d, "pic" -> bytes.toArray) //,"desc"->optDesc.get,"width" -> optWid.get,"height" -> optHgh.get c <- repository.insert(docs).toFuture[Completed] } yield c complete(futmsg.map(_.toString)) } ~ (post ¶meters('pid, 'bson.?)){ (pid,bson)=> val filte = Document(bson.getOrElse("{}")) withoutSizeLimit { decodeRequest { extractDataBytes { bytes => val futbytes = bytes.runFold(ByteString()) { case (hd, bs) => hd ++ bs } val futmsg: Future[Completed] = for { maxSeqno <- repository.query1(equal("pid", pid)).toFuture[Seq[Document]] bytes <- futbytes d = if (maxSeqno == Seq()) 0 else maxSeqno.head.getInteger("seqno") + 1 docs = filte + ("pid" -> pid, "seqno" -> d, "pic" -> bytes.toArray) c <- repository.insert(docs).toFuture[Completed] } yield c complete(futmsg.map(_.toString)) } } } }~
引入download方法
(post ¶meters('pid, 'bson.?,'pic)){ (pid,bson,pic)=> val filte = Document(bson.getOrElse("{}")) val futmsg: Future[Completed] = for { pic1 <- downloadPicture(pic) maxSeqno <- repository.query1(pid).toFuture[Seq[Document]] d = if (maxSeqno == Seq()) 0 else maxSeqno.head.getInteger("seqno") + 1 docs = filte + ("pid" -> pid, "seqno" -> d, "pic1" -> pic1.toArray) c <- repository.insert(docs).toFuture[Completed] } yield c complete(futmsg.map(_.toString)) }~