[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