Ejemplo n.º 1
0
        public async Task <IActionResult> Upload()
        {
            if (!MultipartRequestHelper.IsMultipartContentType(Request.ContentType))
            {
                return(BadRequest());
            }

            try
            {
                if (!Request.Form.Files.Any())
                {
                    return(BadRequest("There is no file."));
                }

                var client = new MongoDB.Driver.MongoClient("mongodb://*****:*****@localhost/?safe=true");
                var db     = client.GetDatabase("memoryvault");

                var coll = db.GetCollection <MemoryItemModel>("memories");

                foreach (var fileReq in Request.Form.Files)
                {
                    GridFSBucketOptions opts = new GridFSBucketOptions();
                    opts.BucketName = "memoryfiles";

                    var bucket = new GridFSBucket(db, opts);

                    ObjectId res;

                    using (var stream = fileReq.OpenReadStream())
                    {
                        res = await bucket.UploadFromStreamAsync(fileReq.FileName, stream);
                    }

                    var ext = System.IO.Path.GetExtension(fileReq.FileName);

                    var memory = new MemoryItemModel
                    {
                        CreateTime    = DateTime.Now,
                        ItemId        = res,
                        FileName      = fileReq.FileName,
                        FileExtension = ext
                    };

                    await coll.InsertOneAsync(memory);

                    QueueRepository.Enqueue(new CreateThumbnailCommand {
                        MemoryId = memory.Id.ToString()
                    });
                }
            }
            catch (MongoWriteException exc)
            {
                if (((MongoBulkWriteException)exc.InnerException).WriteErrors.Any(p => p.Category == ServerErrorCategory.DuplicateKey))
                {
                    return(Ok());
                }

                return(Ok(exc.Message));
            }
            catch (Exception exc)
            {
                return(Ok(exc.Message));
            }

            return(Ok());
        }