• rest实践3


       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 &parameters('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 &parameters('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))
            }~
  • 相关阅读:
    2.替换空格
    1.二维数组的查找
    poj 2431 expedition
    python入门第三天
    python入门第二天__练习题
    [Python3.6] print vs sys.stdout.write
    python入门第二天
    使用Flask-mail发送邮件无法连接主机
    KMP
    逆序对 线段树&树状数组 (重制版)
  • 原文地址:https://www.cnblogs.com/0205gt/p/11320789.html
Copyright © 2020-2023  润新知