Mercurial > pub > Impl
comparison lib/IMPL/Web/DOM/FileNode.pm @ 407:c6e90e02dd17 ref20150831
renamed Lib->lib
author | cin |
---|---|
date | Fri, 04 Sep 2015 19:40:23 +0300 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
406:f23fcb19d3c1 | 407:c6e90e02dd17 |
---|---|
1 package IMPL::Web::DOM::FileNode; | |
2 use parent qw(IMPL::DOM::Node); | |
3 | |
4 __PACKAGE__->PassThroughArgs; | |
5 | |
6 use IMPL::Class::Property; | |
7 use File::Temp qw(tempfile); | |
8 | |
9 BEGIN { | |
10 public property parameterName => { | |
11 get => sub { | |
12 my ($this) = @_; | |
13 $this->_parameterName() or | |
14 $this->_parameterName( | |
15 join '/', ( map { | |
16 (defined $_->nodeProperty('instanceId')) ? | |
17 $_->nodeName . '['.$_->nodeProperty('instanceId').']': | |
18 $_->nodeName | |
19 } $this->_selectParents, $this ) | |
20 ); | |
21 } | |
22 }; | |
23 private property _parameterName => prop_all; | |
24 public property fileName => { | |
25 get => sub { | |
26 my ($this) = @_; | |
27 return $this->document->query->param($this->parameterName); | |
28 } | |
29 }; | |
30 public property fileHandle => { | |
31 get => sub { | |
32 my ($this) = @_; | |
33 return $this->document->query->upload($this->parameterName); | |
34 } | |
35 }; | |
36 } | |
37 | |
38 sub invokeTempFile { | |
39 my ($this,$sub,$target) = @_; | |
40 | |
41 die new IMPL::InvalidArgumentException("A reference to a function should be specified") unless $sub && ref $sub eq 'CODE'; | |
42 | |
43 $target ||= $this; | |
44 | |
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')); | |
47 | |
48 my ($hTemp,$tempFileName) = tempfile(); | |
49 binmode($hTemp); | |
50 | |
51 print $hTemp $_ while <$hFile>; | |
52 | |
53 $hTemp->flush(); | |
54 seek $hTemp, 0,0; | |
55 { | |
56 local $_ = $tempFileName; | |
57 $sub->($this,$tempFileName,$hTemp); | |
58 } | |
59 } | |
60 | |
61 sub _selectParents { | |
62 my ($node) = @_; | |
63 | |
64 my @result; | |
65 | |
66 unshift @result, $node while $node = $node->parentNode; | |
67 | |
68 return @result; | |
69 } | |
70 | |
71 1; | |
72 | |
73 __END__ | |
74 | |
75 =pod | |
76 | |
77 =head1 NAME | |
78 | |
79 C<IMPL::Web::DOM::FileNode> - узел, использующийся для представления параметра запроса в котором передан файл. | |
80 | |
81 =head1 SINOPSYS | |
82 | |
83 =begin code xml | |
84 | |
85 <!-- input.schema.xml --> | |
86 <schema> | |
87 <SimpleType type="file" nativeType="IMPL::Web::DOM::FileNode"/> | |
88 <ComplexNode name="user"> | |
89 <Node type="file" name="avatar"/> | |
90 </ComplexNode> | |
91 </schema> | |
92 | |
93 =end code xml | |
94 | |
95 =begin code | |
96 | |
97 # handle.pl | |
98 use IMPL::DOM::Transform::PostToDOM (); | |
99 use IMPL::DOM::Schema; | |
100 use CGI; | |
101 use File::Copy qw(copy); | |
102 | |
103 my $t = new IMPL::DOM::Transform::PostToDOM( | |
104 undef, | |
105 IMPL::DOM::Schema->LoadSchema('input.schema.xml'), | |
106 'user' | |
107 ); | |
108 | |
109 my $doc = $t->Transform(CGI->new()); | |
110 | |
111 if ($t->Errors->Count) { | |
112 # handle errors | |
113 } | |
114 | |
115 $doc->selectSingleNode('avatar')->invokeTempFile( | |
116 sub { | |
117 my($node,$fname,$fhandle) = @_; | |
118 | |
119 # do smth with file | |
120 copy($_,'avatar.jpg'); | |
121 | |
122 # same thing | |
123 # copy($fname,'avatar.jpg'); | |
124 } | |
125 ); | |
126 | |
127 =end code | |
128 | |
129 =head1 DESCRIPTION | |
130 | |
131 Данный класс используется для представлении параметров C<CGI> запросов при преобзаовании | |
132 запроса в ДОМ документ преобразованием C<IMPL::DOM::Transform::PostToDOM>. | |
133 | |
134 Узлы данного типа расширяют стандатрный C<IMPL::DOM::Node> несколькими свойствами и | |
135 методами для доступа к файлу, переданному в виде параметра запроса. | |
136 | |
137 =head1 MEMBERS | |
138 | |
139 =head2 PROPERTIES | |
140 | |
141 =over | |
142 | |
143 =item C<[get] parameterName> | |
144 | |
145 Имя параметра C<CGI> запроса соответствующего данному узлу. | |
146 | |
147 =item C<[get] fileName> | |
148 | |
149 Имя файла из параметра запроса | |
150 | |
151 =item C<[get] fileHandle> | |
152 | |
153 Указатель на файл из параметра запроса | |
154 | |
155 =back | |
156 | |
157 =head2 METHODS | |
158 | |
159 =over | |
160 | |
161 =item C<invokeTempFile($callback,$target)> | |
162 | |
163 Сохраняет файл, переданный в запросе во временный, вызывает C<$callback> для обработки временного файла. | |
164 | |
165 =over | |
166 | |
167 =item C<$callback> | |
168 | |
169 Ссылка на функцию которая будет вызвана для обработки временного файла. C<callback($target,$fname,$fhandle)> | |
170 | |
171 =over | |
172 | |
173 =item C<$fname> | |
174 | |
175 Имя временного файла | |
176 | |
177 =item C<$fhandle> | |
178 | |
179 Указатель на временный файл | |
180 | |
181 =back | |
182 | |
183 Также пременная C<$_> содержит имя временного файла. | |
184 | |
185 =item C<$target> | |
186 | |
187 Значение этого параметра будет передано первым параметром функции C<$callback>. | |
188 | |
189 =back | |
190 | |
191 =back | |
192 | |
193 =cut |