Jon, that sounds very interesting and I'd love to see it. S3 support
in general would be a great module for Lift, in my opinion.

Peter

On Dec 2, 10:24 am, jon <jonhoff...@gmail.com> wrote:
> For those that are using s3, I created a MappedS3Image MappedField for
> automating the storage of image uploads to s3 with a unique identifier
> stored in the RDBMS.  If anyone's interested I could clean and share
> the code.
>
> usage like this: user.avatar.setFromUpload(fileParamHolderBox) or
> user.avatar.setFromUrl(urlString)
>
> - Jon
>
> On Dec 2, 12:15 am, DMB <combust...@gmail.com> wrote:
>
> > You don't even need f.get in there as it turns out. "f.get" should
> > just be "file". Beautiful. Thanks for the tip.
>
> > On Dec 1, 8:07 pm, David Pollak <feeder.of.the.be...@gmail.com> wrote:
>
> > > On Tue, Dec 1, 2009 at 8:03 PM, DMB <combust...@gmail.com> wrote:
> > > > Ended up doing this:
>
> > > >    def show(xhtml: NodeSeq) : NodeSeq = {
> > > >        if(S.post_?) {
> > > >            val f : Option[FileParamHolder] = S.request match {
> > > >                case Empty => Empty
> > > >                case Full(req) =>
> > > >                    req.uploadedFiles.find(_.name == "file_upload")
> > > >            }
>
> > > >            if(f.isDefined) {
> > > >                acceptFile(f.get)
> > > >            }
> > > >        }
> > > >        return xhtml
> > > >    }
>
> > > This is a place for a for comprehension:
>
> > > def show(xhtml: NodeSeq): NodeSeq = {
> > >   for {
> > >     request <- S.request if S.post_?
> > >     file <- request.uploadedFiles.find(_.name == "file_upload")
> > >   } acceptFile(f.get)
>
> > >   xhtml
>
> > > }
>
> > > Note that the code is shorter, reads better and has no branches in it.
>
> > > > And putting a bare upload field in the snippet, like you sugested. I
> > > > still wonder if the binding method is the best place for this, though.
>
> > > > On Dec 1, 10:14 am, David Pollak <feeder.of.the.be...@gmail.com>
> > > > wrote:
> > > > > If you have the Req (request), you can do:
>
> > > > > val req: Req = ...
> > > > > val theFile: Option[FileParamHolder] = req.uploadedFiles.find(_.name 
> > > > > ==
> > > > > "my_param_name")
>
> > > > > On Tue, Dec 1, 2009 at 2:49 AM, DMB <combust...@gmail.com> wrote:
> > > > > > Just what I was looking for, thanks!
>
> > > > > > By the way, is there a way to assign a "name" attribute to a file
> > > > > > upload input field? The reason is I have a legacy piece of code that
> > > > > > does HTTP uploads by simulating a form submit. This code requires 
> > > > > > that
> > > > > > the form field name be known in advance, for obvious reasons.
>
> > > > > > On Nov 30, 9:26 pm, David Pollak <feeder.of.the.be...@gmail.com>
> > > > > > wrote:
> > > > > > > Folks,
>
> > > > > > > Lately there's been a bunch of chatter on the list about image 
> > > > > > > upload
> > > > and
> > > > > > > figuring out how to put the image files in the right place to 
> > > > > > > serve
> > > > them
> > > > > > > again.
>
> > > > > > > I've written a simple example of image uploading, storing the 
> > > > > > > image
> > > > in
> > > > > > the
> > > > > > > RDBMS and then serving the image.  You can find the code at:
> > > > > >http://github.com/dpp/imagine/
>
> > > > > > > The file upload snippet is very simple:
>
> > > > > > > class DoUpload {
> > > > > > >   private def saveFile(fp: FileParamHolder): Unit = {
> > > > > > >     fp.file match {
> > > > > > >       case null =>
> > > > > > >       case x if x.length == 0 =>
> > > > > > >       case x =>
> > > > > > >         val blob = ImageBlob.create.image(x).saveMe
> > > > > > >         ImageInfo.create.name
> > > > > > > (fp.fileName).mimeType(fp.mimeType).blob(blob).saveMe
> > > > > > >         S.notice("Thanks for the upload")
> > > > > > >         S.redirectTo("/")
> > > > > > >     }
> > > > > > >   }
>
> > > > > > >   def render(in: NodeSeq): NodeSeq =
> > > > > > >   bind("upload", in, "file" -> SHtml.fileUpload(saveFile _))
>
> > > > > > > }
>
> > > > > > > If the blob is uploaded, it's put in a row in ImageBlob and an
> > > > ImageInfo
> > > > > > row
> > > > > > > is created to store the name and mime type.  There are two 
> > > > > > > different
> > > > rows
> > > > > > so
> > > > > > > that one doesn't have to pull the whole blob back when you're
> > > > checking
> > > > > > for
> > > > > > > the upload date.
>
> > > > > > > Serving the image is similarly concise:
>
> > > > > > >   def serveImage: LiftRules.DispatchPF = {
> > > > > > >     case req @ Req("images" :: _ :: Nil, _, GetRequest) if
> > > > > > > findFromRequest(req).isDefined =>
> > > > > > >       () => {
> > > > > > >         val info = findFromRequest(req).open_! // open is valid 
> > > > > > > here
> > > > > > because
> > > > > > > we just tested in the guard
>
> > > > > > >         // Test for expiration
> > > > > > >         req.testFor304(info.date, "Expires" -> 
> > > > > > > toInternetDate(millis
> > > > +
> > > > > > > 30.days)) or
> > > > > > >         // load the blob and return it
> > > > > > >         info.blob.obj.map(blob => InMemoryResponse(blob.image,
> > > > > > > List(("Last-Modified", toInternetDate(info.date.is)),
>
> > > > > > >  ("Expires", toInternetDate(millis + 30.days)),
>
> > > > > > >  ("Content-Type", info.mimeType.is)), Nil,  200))
> > > > > > >       }
> > > > > > >   }
>
> > > > > > > If the request matches /images/xxx where xxx is a name in the
> > > > ImageInfo
> > > > > > > table, check to see if we can return a 304 (not modified).  If 
> > > > > > > not,
> > > > we
> > > > > > pull
> > > > > > > the blob from the database and return it.
>
> > > > > > > I hope this helps folks who are looking to manage and serve 
> > > > > > > images.
>
> > > > > > > Thanks,
>
> > > > > > > David
>
> > > > > > > --
> > > > > > > Lift, the simply functional web frameworkhttp://liftweb.net
> > > > > > > Beginning Scalahttp://www.apress.com/book/view/1430219890
> > > > > > > Follow me:http://twitter.com/dpp
> > > > > > > Surf the harmonics
>
> > > > > > --
>
> > > > > > You received this message because you are subscribed to the Google
> > > > Groups
> > > > > > "Lift" group.
> > > > > > To post to this group, send email to lift...@googlegroups.com.
> > > > > > To unsubscribe from this group, send email to
> > > > > > liftweb+unsubscr...@googlegroups.com<liftweb%2bunsubscr...@googlegroups.com
> > > > > >  >
> > > > <liftweb%2bunsubscr...@googlegroups.com<liftweb%252bunsubscr...@googlegroup
> > > >  s.com>
>
> > > > > > .
> > > > > > For more options, visit this group at
> > > > > >http://groups.google.com/group/liftweb?hl=en.
>
> > > > > --
> > > > > Lift, the simply functional web frameworkhttp://liftweb.net
> > > > > Beginning Scalahttp://www.apress.com/book/view/1430219890
> > > > > Follow me:http://twitter.com/dpp
> > > > > Surf the harmonics
>
> > > > --
>
> > > > You received this message because you are subscribed to the Google 
> > > > Groups
> > > > "Lift" group.
> > > > To post to this group, send email to lift...@googlegroups.com.
> > > > To unsubscribe from this group, send email to
> > > > liftweb+unsubscr...@googlegroups.com<liftweb%2bunsubscr...@googlegroups.com
> > > >  >
> > > > .
> > > > For more options, visit this group at
> > > >http://groups.google.com/group/liftweb?hl=en.
>
> > > --
> > > Lift, the simply functional web frameworkhttp://liftweb.net
> > > Beginning Scalahttp://www.apress.com/book/view/1430219890
> > > Follow me:http://twitter.com/dpp
> > > Surf the harmonics

--

You received this message because you are subscribed to the Google Groups 
"Lift" group.
To post to this group, send email to lift...@googlegroups.com.
To unsubscribe from this group, send email to 
liftweb+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=en.


Reply via email to