public async Task <ObjectId> UploadFileAsync(Stream sourceStream, string fileName, GridFSUploadOptions uploadOptions = null)
        {
            var gridFsBucket = new GridFSBucket(this.database);
            GridFSUploadStream destinationStream = await gridFsBucket.OpenUploadStreamAsync(fileName, uploadOptions);

            //一次缓冲区大小
            long filesize = sourceStream.Length;
            int  maxlenth = 4096;

            byte[] buffer = new byte[maxlenth];
            while (filesize > 0)
            {
                if (filesize < maxlenth)
                {
                    maxlenth = (int)filesize;
                }
                await sourceStream.ReadAsync(buffer, 0, maxlenth);

                await destinationStream.WriteAsync(buffer, 0, maxlenth);

                filesize -= maxlenth;
            }

            await destinationStream.CloseAsync();

            return(destinationStream.Id);
        }
예제 #2
0
        public async Task SaveFileZip(int id, string consumer, Stream file)
        {
            var client = GetClient();

            using (var session = await client.StartSessionAsync())
            {
                session.StartTransaction();

                var fileDoc = new FileDocument
                {
                    Id       = id,
                    Consumer = consumer,
                    FileName = $"{id}_{consumer}",
                    State    = FileState.Uploaded
                };

                var bucket = new GridFSBucket(client.GetDatabase(_url.DatabaseName), new GridFSBucketOptions {
                    BucketName = "Uploads"
                });
                using (var uploadStream = await bucket.OpenUploadStreamAsync(fileDoc.FileName))
                    using (var gzipStream = new GZipStream(uploadStream, CompressionLevel.Optimal))
                    {
                        await file.CopyToAsync(gzipStream);
                    }

                var collection = client.GetDatabase(_url.DatabaseName).GetCollection <FileDocument>(CollectionName);
                await collection.InsertOneAsync(fileDoc);

                await session.CommitTransactionAsync();
            }
        }
예제 #3
0
        public async Task <ObjectId> UploadToStreamAsync(byte[] source, string fileName, GridFSUploadOptions options = null)
        {
            MongoClient client = GetClient(m_connectionStr);
            var         db     = client.GetDatabase(DatabaseName);
            var         bucket = new GridFSBucket(db, BucksOptions);

            using (var stream = await bucket.OpenUploadStreamAsync(fileName, options))
            {
                stream.Write(source, 0, source.Count());
                return(stream.Id);
            }
        }
예제 #4
0
        public async Task <bool> TryCreateDirectoryAsync(string path)
        {
            path = GetPhysicalPath(path);
            var dirpath  = path + "/" + _dirName;
            var fileInfo = await getGridFSFileInfoAsync(dirpath);

            if (fileInfo != null)
            {
                throw new FileStoreException($"Cannot create directory because the path '{path}' already exists and is a file.");
            }

            var response = await _bucket.OpenUploadStreamAsync(dirpath);

            await response.CloseAsync();

            return(response != null);
        }
        private async Task <int> NormalizeAudio(FileReference fileReference, CreateSongRequest requestBody, string authorName)
        {
            var oldId = fileReference._id;
            var newId = ObjectId.GenerateNewId();

            var gridFsBucket   = new GridFSBucket <ObjectId>(MongoWrapper.Database);
            var downloadStream = await gridFsBucket.OpenDownloadStreamAsync(oldId);

            (Stream newAudio, int seconds) = await AudioHandlerService.ProcessAudio
                                             (
                downloadStream,
                requestBody.Autoral?null : new int?(15),
                requestBody.Nome,
                authorName,
                fileReference.FileInfo.FileMetadata.ContentType
                                             );

            fileReference._id = newId;
            if (fileReference.FileInfo == null)
            {
                fileReference.FileInfo = new Models.FileInfo();
            }
            fileReference.FileInfo.FileMetadata.ContentType = "audio/mpeg";
            fileReference.FileInfo.FileMetadata.FileType    = FileType.Audio;

            var uploadStream = await gridFsBucket.OpenUploadStreamAsync
                               (
                newId,
                newId.ToString(),
                new GridFSUploadOptions
            {
                Metadata = fileReference.FileInfo.FileMetadata.ToBsonDocument(),
            }
                               );

            await newAudio.CopyToAsync(uploadStream);

            await uploadStream.CloseAsync();

            var deleteOldTask = gridFsBucket.DeleteAsync(oldId);

            return(seconds);
        }
예제 #6
0
        public async Task UploadFileAsync(
            IMongoDatabase database,
            string filePath,
            string fileName,
            GridFSUploadOptions uploadOptions = null)
        {
            var gridFsBucket = new GridFSBucket(database);

            using (FileStream sourceStream = File.Open(filePath, FileMode.Open))
            {
                using (
                    GridFSUploadStream destinationStream =
                        await gridFsBucket.OpenUploadStreamAsync(fileName, uploadOptions))
                {
                    await sourceStream.CopyToAsync(destinationStream);

                    await destinationStream.CloseAsync();
                }
            }
        }
예제 #7
0
        /// <summary>
        /// Opens a Stream that can be used by the application to write data to a GridFS file.
        /// </summary>
        /// <param name="filename"></param>
        /// <param name="options"></param>
        /// <returns></returns>
        public Task <GridFSUploadStream> OpenUploadStreamAsync(string filename, GridFSUploadOptions options = null)
        {
            var bucket = new GridFSBucket(base.GetDatabase(), BucketOptions);

            return(bucket.OpenUploadStreamAsync(filename, options));
        }