Mercurial > pub > Impl
comparison Lib/IMPL/Web/DOM/FileNode.pm @ 194:4d0e1962161c
Replaced tabs with spaces
IMPL::Web::View - fixed document model, new features (control classes, document constructor parameters)
author | cin |
---|---|
date | Tue, 10 Apr 2012 20:08:29 +0400 |
parents | d1676be8afcc |
children |
comparison
equal
deleted
inserted
replaced
193:8e8401c0aea4 | 194:4d0e1962161c |
---|---|
5 | 5 |
6 use IMPL::Class::Property; | 6 use IMPL::Class::Property; |
7 use File::Temp qw(tempfile); | 7 use File::Temp qw(tempfile); |
8 | 8 |
9 BEGIN { | 9 BEGIN { |
10 public property parameterName => { | 10 public property parameterName => { |
11 get => sub { | 11 get => sub { |
12 my ($this) = @_; | 12 my ($this) = @_; |
13 $this->_parameterName() or | 13 $this->_parameterName() or |
14 $this->_parameterName( | 14 $this->_parameterName( |
15 join '/', ( map { | 15 join '/', ( map { |
16 (defined $_->nodeProperty('instanceId')) ? | 16 (defined $_->nodeProperty('instanceId')) ? |
17 $_->nodeName . '['.$_->nodeProperty('instanceId').']': | 17 $_->nodeName . '['.$_->nodeProperty('instanceId').']': |
18 $_->nodeName | 18 $_->nodeName |
19 } $this->_selectParents, $this ) | 19 } $this->_selectParents, $this ) |
20 ); | 20 ); |
21 } | 21 } |
22 }; | 22 }; |
23 private property _parameterName => prop_all; | 23 private property _parameterName => prop_all; |
24 public property fileName => { | 24 public property fileName => { |
25 get => sub { | 25 get => sub { |
26 my ($this) = @_; | 26 my ($this) = @_; |
27 return $this->document->query->param($this->parameterName); | 27 return $this->document->query->param($this->parameterName); |
28 } | 28 } |
29 }; | 29 }; |
30 public property fileHandle => { | 30 public property fileHandle => { |
31 get => sub { | 31 get => sub { |
32 my ($this) = @_; | 32 my ($this) = @_; |
33 return $this->document->query->upload($this->parameterName); | 33 return $this->document->query->upload($this->parameterName); |
34 } | 34 } |
35 }; | 35 }; |
36 } | 36 } |
37 | 37 |
38 sub invokeTempFile { | 38 sub invokeTempFile { |
39 my ($this,$sub,$target) = @_; | 39 my ($this,$sub,$target) = @_; |
40 | 40 |
41 die new IMPL::InvalidArgumentException("A reference to a function should be specified") unless $sub && ref $sub eq 'CODE'; | 41 die new IMPL::InvalidArgumentException("A reference to a function should be specified") unless $sub && ref $sub eq 'CODE'; |
42 | 42 |
43 $target ||= $this; | 43 $target ||= $this; |
44 | 44 |
45 my $query = $this->document->nodeProperty('query') or die new IMPL::InvalidOperationException("Failed to get a CGI query from the document"); | 45 my $query = $this->document->nodeProperty('query') or die new IMPL::InvalidOperationException("Failed to get a CGI query from the document"); |
46 my $hFile = $query->upload($this->parameterName) or die new IMPL::IOException("Failed to open the uploaded file",$query->cgi_error,$this->parameterName,$this->nodeProperty('instanceId')); | 46 my $hFile = $query->upload($this->parameterName) or die new IMPL::IOException("Failed to open the uploaded file",$query->cgi_error,$this->parameterName,$this->nodeProperty('instanceId')); |
47 | 47 |
48 my ($hTemp,$tempFileName) = tempfile(); | 48 my ($hTemp,$tempFileName) = tempfile(); |
49 binmode($hTemp); | 49 binmode($hTemp); |
50 | 50 |
51 print $hTemp $_ while <$hFile>; | 51 print $hTemp $_ while <$hFile>; |
52 | 52 |
53 $hTemp->flush(); | 53 $hTemp->flush(); |
54 seek $hTemp, 0,0; | 54 seek $hTemp, 0,0; |
55 { | 55 { |
56 local $_ = $tempFileName; | 56 local $_ = $tempFileName; |
57 $sub->($this,$tempFileName,$hTemp); | 57 $sub->($this,$tempFileName,$hTemp); |
58 } | 58 } |
59 } | 59 } |
60 | 60 |
61 sub _selectParents { | 61 sub _selectParents { |
62 my ($node) = @_; | 62 my ($node) = @_; |
63 | 63 |
64 my @result; | 64 my @result; |
65 | 65 |
66 unshift @result, $node while $node = $node->parentNode; | 66 unshift @result, $node while $node = $node->parentNode; |
67 | 67 |
68 return @result; | 68 return @result; |
69 } | 69 } |
70 | 70 |
71 1; | 71 1; |
72 | 72 |
73 __END__ | 73 __END__ |
82 | 82 |
83 =begin code xml | 83 =begin code xml |
84 | 84 |
85 <!-- input.schema.xml --> | 85 <!-- input.schema.xml --> |
86 <schema> | 86 <schema> |
87 <SimpleType type="file" nativeType="IMPL::Web::DOM::FileNode"/> | 87 <SimpleType type="file" nativeType="IMPL::Web::DOM::FileNode"/> |
88 <ComplexNode name="user"> | 88 <ComplexNode name="user"> |
89 <Node type="file" name="avatar"/> | 89 <Node type="file" name="avatar"/> |
90 </ComplexNode> | 90 </ComplexNode> |
91 </schema> | 91 </schema> |
92 | 92 |
93 =end code xml | 93 =end code xml |
94 | 94 |
95 =begin code | 95 =begin code |
99 use IMPL::DOM::Schema; | 99 use IMPL::DOM::Schema; |
100 use CGI; | 100 use CGI; |
101 use File::Copy qw(copy); | 101 use File::Copy qw(copy); |
102 | 102 |
103 my $t = new IMPL::DOM::Transform::PostToDOM( | 103 my $t = new IMPL::DOM::Transform::PostToDOM( |
104 undef, | 104 undef, |
105 IMPL::DOM::Schema->LoadSchema('input.schema.xml'), | 105 IMPL::DOM::Schema->LoadSchema('input.schema.xml'), |
106 'user' | 106 'user' |
107 ); | 107 ); |
108 | 108 |
109 my $doc = $t->Transform(CGI->new()); | 109 my $doc = $t->Transform(CGI->new()); |
110 | 110 |
111 if ($t->Errors->Count) { | 111 if ($t->Errors->Count) { |
112 # handle errors | 112 # handle errors |
113 } | 113 } |
114 | 114 |
115 $doc->selectSingleNode('avatar')->invokeTempFile( | 115 $doc->selectSingleNode('avatar')->invokeTempFile( |
116 sub { | 116 sub { |
117 my($node,$fname,$fhandle) = @_; | 117 my($node,$fname,$fhandle) = @_; |
118 | 118 |
119 # do smth with file | 119 # do smth with file |
120 copy($_,'avatar.jpg'); | 120 copy($_,'avatar.jpg'); |
121 | 121 |
122 # same thing | 122 # same thing |
123 # copy($fname,'avatar.jpg'); | 123 # copy($fname,'avatar.jpg'); |
124 } | 124 } |
125 ); | 125 ); |
126 | 126 |
127 =end code | 127 =end code |
128 | 128 |
129 =head1 DESCRIPTION | 129 =head1 DESCRIPTION |
177 =item C<$fhandle> | 177 =item C<$fhandle> |
178 | 178 |
179 Указатель на временный файл | 179 Указатель на временный файл |
180 | 180 |
181 =back | 181 =back |
182 | 182 |
183 Также пременная C<$_> содержит имя временного файла. | 183 Также пременная C<$_> содержит имя временного файла. |
184 | 184 |
185 =item C<$target> | 185 =item C<$target> |
186 | 186 |
187 Значение этого параметра будет передано первым параметром функции C<$callback>. | 187 Значение этого параметра будет передано первым параметром функции C<$callback>. |