[Seaside] Suggestion: WAFile subclass: #WAImage for image uploads
(WAKom Swazoo difference)
Dmitry Dorofeev
dima-sender-3c337a at yasp.com
Mon Apr 4 15:49:18 CEST 2005
Avi Bryant wrote:
> On Mar 24, 2005 4:16 PM, Dmitry Dorofeev <dima-sender-3c337a at yasp.com> wrote:
>
>>Thanks, Mike.
>>
>>I have converted it to Seaside/Squeak! Wow.
>
>
> Was this ever posted to the list? I've only seen the VW changeset.
Here it is.
Note that WAImage is in the 'Polovinka' category.
-Dmitry.
>
> Avi
> _______________________________________________
> Seaside mailing list
> Seaside at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/listinfo/seaside
-------------- next part --------------
'From Squeak3.7 of ''4 September 2004'' [latest update: #5989] on 4 April 2005 at 5:36:46 pm'!
WAFile subclass: #WAImage
instanceVariableNames: 'width height type'
classVariableNames: ''
poolDictionaries: ''
category: 'Polovinka'!
!WAImage commentStamp: '<historical>' prior: 0!
Don't forget to have
html attributeAt: 'enctype' put: 'multipart/form-data'.
before your form !!!!!!!
!WAImage methodsFor: 'accessing' stamp: 'Deem0N 3/20/2005 14:51'!
height
"Answer the value of height"
^ height! !
!WAImage methodsFor: 'accessing' stamp: 'd.d. 3/24/2005 00:26'!
height: anObject
"Set the value of height"
height _ anObject! !
!WAImage methodsFor: 'accessing' stamp: 'Deem0N 3/20/2005 14:52'!
type
"Answer the value of imageType"
^ type! !
!WAImage methodsFor: 'accessing' stamp: 'd.d. 3/24/2005 00:26'!
type: anObject
"Set the value of type"
type _ anObject! !
!WAImage methodsFor: 'accessing' stamp: 'Deem0N 3/20/2005 14:51'!
width
"Answer the value of width"
^ width! !
!WAImage methodsFor: 'accessing' stamp: 'd.d. 3/24/2005 00:26'!
width: anObject
"Set the value of width"
width _ anObject! !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
WAImage class
instanceVariableNames: ''!
!WAImage class methodsFor: 'as yet unclassified' stamp: 'd.d. 3/24/2005 01:26'!
contentTypes
^ Dictionary new
at: 'gif' put: 'image/gif';
at: 'jpg' put: 'image/jpeg';
at: 'png' put: 'image/png';
yourself.! !
!WAImage class methodsFor: 'as yet unclassified' stamp: 'deem0N 3/25/2005 23:42'!
fromFile: waFile
| dim byteArray header |
byteArray := waFile contents asByteArray.
((waFile contents asString beginsWith: 'GIF87a') or: [waFile contents asString beginsWith: 'GIF89a']) ifTrue: [
[dim := self getGIFDimensionsFrom: byteArray readStream.
^ self fromFile: waFile dimensions: dim type: 'gif'] on: Error do: [:e | NotAnImage raiseSignal. ].
].
(byteArray byteAt: 1) = 16rFF ifTrue: [
(byteArray byteAt: 2) = 16rD8 ifTrue: [
[
dim := self getJPGDimensionsFrom: byteArray readStream.
^ self fromFile: waFile dimensions: dim type: 'jpg'
] on: Error do: [:e | NotAnImage raiseSignal. ]
]
].
header := #(16r89 80 78 71 16r0D 16r0A 16r1A 16r0A).
(byteArray size > header size and: [(byteArray copyFrom: 1 to: header size) = header]) ifTrue: [
[dim := self getPNGDimensionsFrom: byteArray readStream.
^ self fromFile: waFile dimensions: dim type: 'png'] on: Error do: [:e | NotAnImage raiseSignal. ].
].
"^Error new signal: aString"
^NotAnImage new signal: 'Image file format unrecognized'.! !
!WAImage class methodsFor: 'as yet unclassified' stamp: 'd.d. 3/24/2005 01:27'!
fromFile: waFile dimensions: dim type: aType
^ self new
contents: waFile contents;
fileName: waFile fileName;
contentType: waFile contentType;
width: dim x;
height: dim y;
type: aType;
contentType: (self contentTypes at: aType);
yourself.! !
!WAImage class methodsFor: 'as yet unclassified' stamp: 'd.d. 3/24/2005 01:25'!
getGIFDimensionsFrom: aStream
"More precise code is in Perl Module Image::Size. I will pick it up one day"
aStream skip: 6.
^ (aStream nextLittleEndianNumber: 2) @ (aStream nextLittleEndianNumber: 2)! !
!WAImage class methodsFor: 'as yet unclassified' stamp: 'd.d. 3/24/2005 01:25'!
getJPGDimensionsFrom: aStream
| sectionMarker sizeFirst sizeLast marker code length |
sectionMarker := 16rFF.
sizeFirst := 16rC0.
sizeLast := 16rC3.
aStream skip: 2.
[
marker := aStream next.
code := aStream next.
length := aStream uint16.
marker = sectionMarker ifFalse: [self error: 'JPEG marker not found'].
(code >= sizeFirst and: [code <= sizeLast]) ifTrue: [
aStream skip: 1.
^ aStream uint16 @ aStream uint16.
] ifFalse: [
aStream skip: (length - 2).
]
] repeat.! !
!WAImage class methodsFor: 'as yet unclassified' stamp: 'd.d. 3/24/2005 01:25'!
getPNGDimensionsFrom: aStream
aStream skip: 16.
^ aStream nextInt32 @ aStream nextInt32.! !
-------------- next part --------------
'From Squeak3.7 of ''4 September 2004'' [latest update: #5989] on 4 April 2005 at 5:37:42 pm'!
!WAFile methodsFor: 'as yet unclassified' stamp: 'd.d. 3/28/2005 20:55'!
asImage
^ WAImage fromFile: self.! !
More information about the Seaside
mailing list