芝麻web文件管理V1.00
编辑当前文件:/home2/sdektunc/.trash/cepali/cache/stores/mongodb/MongoDB/GridFS/WritableStream.php
new ObjectId, 'chunkSizeBytes' => self::$defaultChunkSizeBytes, 'disableMD5' => false, ]; if (isset($options['aliases']) && ! \MongoDB\is_string_array($options['aliases'])) { throw InvalidArgumentException::invalidType('"aliases" option', $options['aliases'], 'array of strings'); } if (isset($options['chunkSizeBytes']) && ! is_integer($options['chunkSizeBytes'])) { throw InvalidArgumentException::invalidType('"chunkSizeBytes" option', $options['chunkSizeBytes'], 'integer'); } if (isset($options['chunkSizeBytes']) && $options['chunkSizeBytes'] < 1) { throw new InvalidArgumentException(sprintf('Expected "chunkSizeBytes" option to be >= 1, %d given', $options['chunkSizeBytes'])); } if (isset($options['disableMD5']) && ! is_bool($options['disableMD5'])) { throw InvalidArgumentException::invalidType('"disableMD5" option', $options['disableMD5'], 'boolean'); } if (isset($options['contentType']) && ! is_string($options['contentType'])) { throw InvalidArgumentException::invalidType('"contentType" option', $options['contentType'], 'string'); } if (isset($options['metadata']) && ! is_array($options['metadata']) && ! is_object($options['metadata'])) { throw InvalidArgumentException::invalidType('"metadata" option', $options['metadata'], 'array or object'); } $this->chunkSize = $options['chunkSizeBytes']; $this->collectionWrapper = $collectionWrapper; $this->disableMD5 = $options['disableMD5']; if ( ! $this->disableMD5) { $this->hashCtx = hash_init('md5'); } $this->file = [ '_id' => $options['_id'], 'chunkSize' => $this->chunkSize, 'filename' => (string) $filename, ] + array_intersect_key($options, ['aliases' => 1, 'contentType' => 1, 'metadata' => 1]); } /** * Return internal properties for debugging purposes. * * @see http://php.net/manual/en/language.oop5.magic.php#language.oop5.magic.debuginfo * @return array */ public function __debugInfo() { return [ 'bucketName' => $this->collectionWrapper->getBucketName(), 'databaseName' => $this->collectionWrapper->getDatabaseName(), 'file' => $this->file, ]; } /** * Closes an active stream and flushes all buffered data to GridFS. */ public function close() { if ($this->isClosed) { // TODO: Should this be an error condition? e.g. BadMethodCallException return; } if (strlen($this->buffer) > 0) { $this->insertChunkFromBuffer(); } $this->fileCollectionInsert(); $this->isClosed = true; } /** * Return the stream's file document. * * @return stdClass */ public function getFile() { return (object) $this->file; } /** * Return the stream's size in bytes. * * Note: this value will increase as more data is written to the stream. * * @return integer */ public function getSize() { return $this->length + strlen($this->buffer); } /** * Return the current position of the stream. * * This is the offset within the stream where the next byte would be * written. Since seeking is not supported and writes are appended, this is * always the end of the stream. * * @see WritableStream::getSize() * @return integer */ public function tell() { return $this->getSize(); } /** * Inserts binary data into GridFS via chunks. * * Data will be buffered internally until chunkSizeBytes are accumulated, at * which point a chunk document will be inserted and the buffer reset. * * @param string $data Binary data to write * @return integer */ public function writeBytes($data) { if ($this->isClosed) { // TODO: Should this be an error condition? e.g. BadMethodCallException return; } $bytesRead = 0; while ($bytesRead != strlen($data)) { $initialBufferLength = strlen($this->buffer); $this->buffer .= substr($data, $bytesRead, $this->chunkSize - $initialBufferLength); $bytesRead += strlen($this->buffer) - $initialBufferLength; if (strlen($this->buffer) == $this->chunkSize) { $this->insertChunkFromBuffer(); } } return $bytesRead; } private function abort() { try { $this->collectionWrapper->deleteChunksByFilesId($this->file['_id']); } catch (DriverRuntimeException $e) { // We are already handling an error if abort() is called, so suppress this } $this->isClosed = true; } private function fileCollectionInsert() { $this->file['length'] = $this->length; $this->file['uploadDate'] = new UTCDateTime; if ( ! $this->disableMD5) { $this->file['md5'] = hash_final($this->hashCtx); } try { $this->collectionWrapper->insertFile($this->file); } catch (DriverRuntimeException $e) { $this->abort(); throw $e; } return $this->file['_id']; } private function insertChunkFromBuffer() { if (strlen($this->buffer) == 0) { return; } $data = $this->buffer; $this->buffer = ''; $chunk = [ 'files_id' => $this->file['_id'], 'n' => $this->chunkOffset, 'data' => new Binary($data, Binary::TYPE_GENERIC), ]; if ( ! $this->disableMD5) { hash_update($this->hashCtx, $data); } try { $this->collectionWrapper->insertChunk($chunk); } catch (DriverRuntimeException $e) { $this->abort(); throw $e; } $this->length += strlen($data); $this->chunkOffset++; } }