added a copy method to C::R::Upload and updated Cookbook
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Manual / Cookbook.pod
index 2c126d1..aa38da5 100644 (file)
@@ -87,19 +87,20 @@ Catalyst Controller module 'upload' action:
 
     sub upload : Global {
         my ($self, $c) = @_;
-        if ($c->req->parameters->{form_submit} eq 'yes') {
-            my $upload = $c->req->upload('my_file');
-            if ($upload->filename) {
+
+        if ( $c->request->parameters->{form_submit} eq 'yes' ) {
+
+            if ( my $upload = $c->request->upload('my_file') ) {
+            
                 my $filename = $upload->filename;
-                my $fh = $upload->fh;
-                open(NEW_FILE, ">/tmp/upload/$filename") or die
-                    "Can't open file for writing: $!";
-                while ($fh->read(my $buf, 32768)) {
-                    print NEW_FILE $buf;
+                my $target   = "/tmp/upload/$filename";
+                
+                unless ( $upload->link($target) || $upload->copy($target) ) {
+                    die( "Failed to copy '$filename' to '$target': $!" );
                 }
-                close(NEW_FILE);
             }
         }
+        
         $c->stash->{template} = 'file_upload.html';
     }
 
@@ -122,21 +123,20 @@ Controller:
 
     sub upload : Local {
         my ($self, $c) = @_;
-        if ($c->req->parameters->{form_submit} eq 'yes') {
-            for my $field ($c->req->upload) {
-                my $upload = $c->req->upload($field);
-                if ($upload->filename) {
-                    my $filename = $upload->filename;
-                    my $fh = $upload->fh;
-                    open(NEW_FILE, ">/tmp/upload/$filename") or die
-                        "Can't open file for writing: $!";
-                    while ($fh->read(my $buf, 32768)) {
-                        print NEW_FILE $buf;
-                    }
-                    close(NEW_FILE);
+
+        if ( $c->request->parameters->{form_submit} eq 'yes' ) {
+
+            for my $field ( $c->req->upload ) {
+
+                my $filename = $upload->filename;
+                my $target   = "/tmp/upload/$filename";
+                
+                unless ( $upload->link($target) || $upload->copy($target) ) {
+                    die( "Failed to copy '$filename' to '$target': $!" );
                 }
             }
         }
+
         $c->stash->{template} = 'file_upload.html';
     }