function getFileMD5sum($path)
 {
     if (is_file($path)) {
         return PHP_BigFile::getMd5Sum($path);
     } else {
         return false;
     }
 }
 /**
  * Compares the local and the distant checksums and throw an error if they are different
  */
 function checkChecksum($group_id, $item_id, $filename)
 {
     $this->setSoapCommand('getDocmanFileMD5sum');
     $soap_params = array('group_id' => $group_id, 'item_id' => $item_id);
     $local_checksum = PHP_BigFile::getMd5Sum($filename);
     // For very big files, the checksum can take several minutes to be computed, so we set the socket timeout to 10 minutes
     $default_socket_timeout = ini_set('default_socket_timeout', 600);
     $distant_checksum = $GLOBALS['soap']->call('getDocmanFileMD5sum', $soap_params, $this->use_extra_params());
     //revert default_socket_timeout
     if ($default_socket_timeout !== false) {
         ini_set('default_socket_timeout', $default_socket_timeout);
     }
     if ($local_checksum == $distant_checksum) {
         echo "File uploaded successfully\n";
     } else {
         echo "ERROR: Local and remote checksums are not the same. You should remove the document on the server, and try to create it again.\n";
     }
 }
 /**
  * Computes the md5sum for a given file
  * 
  * @param String $filePath
  *
  * @return String
  */
 public function computeFRSMd5Sum($filePath)
 {
     return PHP_BigFile::getMd5Sum($filePath);
 }
Exemple #4
0
 function getIncomingFileMd5Sum($file)
 {
     return PHP_BigFile::getMd5Sum($file);
 }
 /**
  * Create a new file based on given objects
  *
  * Given a "transient" file object, physically move the file from it's landing zone to
  * it's release area and create the corresponding entry in the database.
  *
  * @param FRSFile    $file    File to create
  *
  * @return FRSFile
  */
 public function createFile(FRSFile $file, $extraFlags = self::COMPUTE_MD5)
 {
     $rule = new Rule_FRSFileName();
     if (!$rule->isValid($file->getFileName())) {
         throw new FRSFileIllegalNameException($file);
     }
     $rel = $file->getRelease();
     if ($this->isFileBaseNameExists($file->getFileName(), $rel->getReleaseID(), $rel->getGroupID())) {
         throw new FRSFileExistsException($file);
     }
     if ($this->isSameFileMarkedToBeRestored($file->getFileName(), $rel->getReleaseID(), $rel->getGroupID())) {
         throw new FRSFileToBeRestoredException($file);
     }
     clearstatcache();
     $filePath = $this->getSrcDir($rel->getProject()) . '/' . $file->getFileName();
     if (!file_exists($filePath)) {
         throw new FRSFileInvalidNameException($file);
     }
     if (0 != ($extraFlags & self::COMPUTE_MD5)) {
         $file->setComputedMd5(PHP_BigFile::getMd5Sum($filePath));
         if (!$this->compareMd5Checksums($file->getComputedMd5(), $file->getReferenceMd5())) {
             throw new FRSFileMD5SumException($file);
         }
     }
     $file->setFileSize(PHP_BigFile::getSize($filePath));
     $file->setStatus('A');
     if ($this->moveFileForge($file)) {
         $fileId = $this->create($file->toArray());
         if ($fileId) {
             $file->setFileID($fileId);
             return $file;
         } else {
             throw new FRSFileDbException($file);
         }
     } else {
         throw new FRSFileForgeException($file);
     }
 }
 function soapCall($soap_params, $use_extra_params = true)
 {
     // Prepare SOAP parameters
     $callParams = $soap_params;
     unset($callParams['remote_name']);
     unset($callParams['output']);
     $callParams['offset'] = 0;
     $callParams['chunk_size'] = $GLOBALS['soap']->getFileChunkSize();
     $startTime = microtime(true);
     $totalTran = 0;
     $i = 0;
     do {
         $callParams['offset'] = $i * $GLOBALS['soap']->getFileChunkSize();
         $content = base64_decode($GLOBALS['soap']->call($this->soapCommand, $callParams, $use_extra_params));
         if ($i == 0) {
             $this->manageOutput($soap_params, $output, $fd);
         }
         $cLength = strlen($content);
         if ($output !== false) {
             $written = fwrite($fd, $content);
             if ($written != $cLength) {
                 throw new Exception('Received ' . $cLength . ' of data but only ' . $written . ' written on Disk');
             }
         } else {
             echo $content;
         }
         $totalTran += $cLength;
         $i++;
     } while ($cLength >= $GLOBALS['soap']->getFileChunkSize());
     $endTime = microtime(true);
     $GLOBALS['LOG']->add('File download completed');
     $transRate = $totalTran / ($endTime - $startTime);
     $GLOBALS['LOG']->add('Transfer rate: ' . size_readable($transRate, null, 'bi', '%.2f %s/s'));
     if ($output !== false) {
         fclose($fd);
         unset($callParams['offset']);
         unset($callParams['chunk_size']);
         $fileInfo = $GLOBALS['soap']->call('getFileInfo', $callParams, $use_extra_params);
         if ($fileInfo->computed_md5) {
             $GLOBALS['LOG']->add('Compute downloaded file\'s md5 sum');
             $localChecksum = PHP_BigFile::getMd5Sum($output);
             if ($localChecksum != $fileInfo->computed_md5) {
                 exit_error("File transfer faild: md5 checksum locally computed doesn't match remote one ({$fileInfo->computed_md5})");
             } else {
                 echo "File retrieved successfully (md5 checksum verified).\n";
             }
         } else {
             echo "File retrieved successfully.\n";
         }
     }
 }
 function before_soapCall(&$loaded_params)
 {
     $this->soapCommand = 'addUploadedFile';
     if (!$loaded_params['others']['uploaded_file'] && !$loaded_params['others']['local_file']) {
         exit_error("You must specify a file name with either the --local_file or --uploaded_file parameter, depending the way you want to add the file.");
     } else {
         if (!$loaded_params['others']['local_file']) {
             // we will test if the file is present in the incoming directory
             $uploaded_files = $GLOBALS['soap']->call("getUploadedFiles", array('group_id' => $loaded_params['soap']['group_id']));
             if (!in_array($loaded_params['others']['uploaded_file'], $uploaded_files)) {
                 exit_error("File '" . $loaded_params['others']['uploaded_file'] . "' not found in incoming directory.");
             }
             $loaded_params['soap']['filename'] = $loaded_params['others']['uploaded_file'];
         } else {
             $localFileLocation = $loaded_params['others']['local_file'];
             if (!file_exists($localFileLocation)) {
                 exit_error("File '" . $localFileLocation . "' doesn't exist");
             } else {
                 if (!is_readable($localFileLocation)) {
                     exit_error("Could not open '" . $localFileLocation . "' for reading");
                 } else {
                     // TODO : use PHP_BigFile
                     //$path = PHP_BigFile::stream(realpath($localFileLocation));
                     $path = realpath($localFileLocation);
                     $GLOBALS['LOG']->add('Calculating md5 checksum of the file ...');
                     $loaded_params['soap']['reference_md5'] = PHP_BigFile::getMd5Sum($path);
                     $GLOBALS['LOG']->add('Md5 checksum calculated.');
                     $offset = 0;
                     $chunkSize = $GLOBALS['soap']->getFileChunkSize();
                     $startTime = microtime(true);
                     $totalTran = 0;
                     $i = 0;
                     /* During this loop the file in construction in the incoming directory
                      * may be corrupted by concurrent access, such as releasing it
                      * or use of addFileChunk again with the same filename.
                      * This corruption will be automatically detected at the end of upload
                      * when comparing the md5 sums and file will not be released.
                      */
                     do {
                         $offset = $i * $chunkSize;
                         $contents = file_get_contents($path, false, NULL, $offset, $chunkSize);
                         $cLength = strlen($contents);
                         $contents = base64_encode($contents);
                         if ($i == 0) {
                             $firstChunk = true;
                         } else {
                             $firstChunk = false;
                         }
                         $addedSize = $GLOBALS['soap']->call("addFileChunk", array('filename' => basename($path), 'contents' => $contents, 'first_chunk' => $firstChunk));
                         if ($addedSize == $cLength) {
                             $totalTran += $cLength;
                             $i++;
                         } else {
                             exit_error("Upload of the file failed");
                         }
                     } while ($cLength >= $chunkSize);
                     $endTime = microtime(true);
                     $transRate = $totalTran / ($endTime - $startTime);
                     $GLOBALS['LOG']->add('Transfer rate: ' . size_readable($transRate, null, 'bi', '%.2f %s/s'));
                     $loaded_params['soap']['filename'] = basename($loaded_params['others']['local_file']);
                     $loaded_params['soap']['is_upload'] = true;
                 }
             }
         }
         // sort the parameters in the right order
         uksort($loaded_params['soap'], array($this, "sort_parameters"));
     }
 }
 function soapCall($soap_params, $use_extra_params = true)
 {
     // Prepare SOAP parameters
     $callParams = $soap_params;
     unset($callParams['remote_name']);
     unset($callParams['output']);
     $callParams['chunk_offset'] = 0;
     $callParams['chunk_size'] = $GLOBALS['soap']->getFileChunkSize();
     $startTime = microtime(true);
     $totalTran = 0;
     $i = 0;
     do {
         $callParams['chunk_offset'] = $i * $GLOBALS['soap']->getFileChunkSize();
         $content = base64_decode($GLOBALS['soap']->call($this->soapCommand, $callParams, $use_extra_params));
         if ($i == 0) {
             $this->manageOutput($soap_params, $output, $fd);
         }
         $cLength = strlen($content);
         if ($output !== false) {
             $written = fwrite($fd, $content);
             if ($written != $cLength) {
                 throw new Exception('Received ' . $cLength . ' of data but only ' . $written . ' written on Disk');
             }
         } else {
             echo $content;
         }
         $totalTran += $cLength;
         $i++;
     } while ($cLength >= $GLOBALS['soap']->getFileChunkSize());
     $endTime = microtime(true);
     $transRate = $totalTran / ($endTime - $startTime);
     $GLOBALS['LOG']->add('Transfer rate: ' . size_readable($transRate, null, 'bi', '%.2f %s/s'));
     // Finish!
     if ($output !== false) {
         fclose($fd);
         unset($callParams['chunk_offset']);
         unset($callParams['chunk_size']);
         //Check the md5sum
         $localChecksum = PHP_BigFile::getMd5Sum($output);
         $remoteChecksum = $GLOBALS['soap']->call('getDocmanFileMD5sum', $callParams, $use_extra_params);
         if ($localChecksum == $remoteChecksum) {
             echo "File retrieved successfully.\n";
         } else {
             exit_error("Local and remote checksums are not the same. Try to download it again.\n");
         }
     }
 }