WordPress.org

Make WordPress Core

Ticket #21497: resumable-upload.diff

File resumable-upload.diff, 4.5 KB (added by pento, 21 months ago)
  • wp-includes/class-wp-xmlrpc-server.php

     
    45244524                $data        = $args[3]; 
    45254525 
    45264526                $name = sanitize_file_name( $data['name'] ); 
     4527 
     4528                $path = ''; 
     4529                if( ! empty( $data['path'] ) ) 
     4530                        $path = $data['path']; 
     4531 
     4532                $url = ''; 
     4533                if( ! empty( $data['url'] ) ) 
     4534                        $url = $data['url']; 
     4535 
     4536                $filesize = 0; 
     4537                if( ! empty( $data['filesize'] ) ) 
     4538                        $filesize = $data['filesize']; 
     4539 
    45274540                $type = $data['type']; 
    4528                 $bits = $data['bits']; 
     4541                $bits = base64_decode( $data['bits'] ); 
    45294542 
    45304543                if ( !$user = $this->login($username, $password) ) 
    45314544                        return $this->error; 
    45324545 
    4533                 do_action('xmlrpc_call', 'metaWeblog.newMediaObject'); 
     4546                if ( empty( $data['resume'] ) || false == $data['resume'] ) 
     4547                        do_action('xmlrpc_call', 'metaWeblog.newMediaObject'); 
    45344548 
    45354549                if ( !current_user_can('upload_files') ) { 
    45364550                        $this->error = new IXR_Error( 401, __( 'You do not have permission to upload files.' ) ); 
     
    45584572                        $name = "wpid{$old_file->ID}-{$filename}"; 
    45594573                } 
    45604574 
    4561                 $upload = wp_upload_bits($name, null, $bits); 
    4562                 if ( ! empty($upload['error']) ) { 
    4563                         $errorString = sprintf(__('Could not write file %1$s (%2$s)'), $name, $upload['error']); 
    4564                         return new IXR_Error(500, $errorString); 
     4575                if ( ! empty( $data['resume'] ) && true == $data['resume'] && $data['location'] > 0 ) { 
     4576                        if( ! file_exists( $path ) ) 
     4577                                return new IXR_Error( 500, sprintf( __( 'File %1$s does not exist' ), $name ) ); 
     4578 
     4579                        // Continue uploading the file 
     4580                        if( ! file_exists( $path ) ) 
     4581                                return new IXR_Error( 500, sprintf( __( 'File %1$s does not exist' ), $name ) ); 
     4582                         
     4583                        if( filesize( $path ) != $data['location'] ) 
     4584                                return new IXR_Error( 500, sprintf( __( '%1$d is an invalid write position for file %2$s' ), $data['location'], $name ) ); 
     4585                                 
     4586                        $fh = fopen( $path, 'a' ); 
     4587                        if( ! $fh ) 
     4588                                return new IXR_Error( 500, sprintf( __( 'Unable to open file %1$s for writing' ), $name ) ); 
     4589                                 
     4590                        $res = fwrite( $fh, $bits ); 
     4591                        if( false === $res ) 
     4592                                return new IXR_Error( 500, sprintf( __( 'Unable to write to file %1$s' ), $name ) ); 
     4593 
     4594                        clearstatcache(); 
     4595                        fclose( $fh ); 
    45654596                } 
    4566                 // Construct the attachment array 
    4567                 // attach to post_id 0 
    4568                 $post_id = 0; 
    4569                 $attachment = array( 
    4570                         'post_title' => $name, 
    4571                         'post_content' => '', 
    4572                         'post_type' => 'attachment', 
    4573                         'post_parent' => $post_id, 
    4574                         'post_mime_type' => $type, 
    4575                         'guid' => $upload[ 'url' ] 
    4576                 ); 
     4597                else { 
     4598                        // Create a new file (resumable or non) 
     4599                        $upload = wp_upload_bits($name, null, $bits); 
     4600                        if ( ! empty($upload['error']) ) { 
     4601                                $errorString = sprintf(__('Could not write file %1$s (%2$s)'), $name, $upload['error']); 
     4602                                return new IXR_Error(500, $errorString); 
     4603                        } 
     4604                 
     4605                        $path = $upload['file']; 
     4606                        $url = $upload['url']; 
     4607                } 
    45774608 
    4578                 // Save the data 
    4579                 $id = wp_insert_attachment( $attachment, $upload[ 'file' ], $post_id ); 
    4580                 wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $upload['file'] ) ); 
     4609                if( empty( $data['resume'] ) || false == $data['resume'] || 
     4610                        ( ! empty( $data['resume'] ) && true == $data['resume'] && filesize( $path ) >= $filesize ) ) { 
     4611                        // Either this is a non-resumable upload, or we've finished uploading a resumable upload 
    45814612 
    4582                 do_action( 'xmlrpc_call_success_mw_newMediaObject', $id, $args ); 
     4613                        // Construct the attachment array 
     4614                        // attach to post_id 0 
     4615                        $post_id = 0; 
     4616                        $attachment = array( 
     4617                                'post_title' => $name, 
     4618                                'post_content' => '', 
     4619                                'post_type' => 'attachment', 
     4620                                'post_parent' => $post_id, 
     4621                                'post_mime_type' => $type, 
     4622                                'guid' => $url 
     4623                        ); 
     4624         
     4625                        // Save the data 
     4626                        $id = wp_insert_attachment( $attachment, $path, $post_id ); 
     4627                        wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $path ) ); 
     4628         
     4629                        do_action( 'xmlrpc_call_success_mw_newMediaObject', $id, $args ); 
     4630         
     4631                        $struct = array( 
     4632                                'id'   => strval( $id ), 
     4633                                'file' => $name, 
     4634                                'url'  => $url, 
     4635                                'type' => $type 
     4636                        ); 
     4637                        return apply_filters( 'wp_handle_upload', $struct, 'upload' ); 
     4638                } 
     4639                else { 
     4640                        $struct = array( 
     4641                                'file' => $name, 
     4642                                'url'  => $url, 
     4643                                'type' => $type, 
     4644                                'path' => $path, 
     4645                        ); 
    45834646 
    4584                 $struct = array( 
    4585                         'id'   => strval( $id ), 
    4586                         'file' => $name, 
    4587                         'url'  => $upload[ 'url' ], 
    4588                         'type' => $type 
    4589                 ); 
    4590                 return apply_filters( 'wp_handle_upload', $struct, 'upload' ); 
     4647                        return apply_filters( 'wp_handle_resumable_upload', $struct, 'upload' ); 
     4648                } 
    45914649        } 
    45924650 
    45934651        /* MovableType API functions