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