/// <summary>
        /// Inserts a picture
        /// </summary>
        /// <param name="pictureBinary">The picture binary</param>
        /// <param name="mimeType">The picture MIME type</param>
        /// <param name="seoFilename">The SEO filename</param>
        /// <param name="altAttribute">"alt" attribute for "img" HTML element</param>
        /// <param name="titleAttribute">"title" attribute for "img" HTML element</param>
        /// <param name="isNew">A value indicating whether the picture is new</param>
        /// <param name="validateBinary">A value indicating whether to validated provided picture binary</param>
        /// <returns>Picture</returns>
        public virtual AUFileRecord InsertFile(byte[] fileBinary, string mimeType, string seoFilename,
            string altAttribute = null, string titleAttribute = null,
            bool isNew = true, bool validateBinary = true)
        {
            mimeType = CommonHelper.EnsureNotNull(mimeType);
            mimeType = CommonHelper.EnsureMaximumLength(mimeType, 20);

            //NJM: don't deal with seo stuff for files
            //seoFilename = CommonHelper.EnsureMaximumLength(seoFilename, 100);

            //NJM: don't validate dimensions of (non-picture) files
            //if (validateBinary)
            //    pictureBinary = ValidatePicture(pictureBinary, mimeType);

            var file = new AUFileRecord
            {
                //PictureBinary = this.StoreInDb ? pictureBinary : new byte[0],
                FileBinary = new byte[0],
                MimeType = mimeType,
                //SeoFilename = seoFilename,
                AltAttribute = altAttribute,
                TitleAttribute = titleAttribute,
                IsNew = isNew,
            };
            _fileRepo.Insert(file);

            //if (!this.StoreInDb)
                SaveFileInFile(file.Id, fileBinary, mimeType);

            //event notification
            _eventPublisher.EntityInserted(file);

            return file;
        }
        /// <summary>
        /// Gets the loaded picture binary depending on picture storage settings
        /// </summary>
        /// <param name="picture">Picture</param>
        /// <param name="fromDb">Load from database; otherwise, from file system</param>
        /// <returns>Picture binary</returns>
        protected virtual byte[] LoadFileBinary(AUFileRecord file, bool fromDb)
        {
            if (file == null)
                throw new ArgumentNullException("file");

            //NJM: Always load files from disk (see C:\Users\Nicholas\Documents\My Documents\NopCommerce\Libraries\Nop.Services\Media\PictureService.cs)
            //var result = fromDb
            //    ? picture.PictureBinary
            //    : LoadPictureFromFile(picture.Id, picture.MimeType);

            var result = LoadFileFromFile(file.Id, file.MimeType);

            return result;
        }
        /// <summary>
        /// Gets the loaded file binary depending on file storage settings
        /// </summary>
        /// <param name="file">File</param>
        /// <returns>File binary</returns>
        public virtual byte[] LoadFileBinary(AUFileRecord file)
        {
            //NJM: Don't use StoreInDb setting - always go to disk for files/documents
            //return LoadPictureBinary(picture, this.StoreInDb);
            return LoadFileBinary(file, false);

        }
        public virtual string GetFileUrl(AUFileRecord file,
           int targetSize = 0,
           bool showDefaultPicture = true,
           string storeLocation = null,
           AUFileTypeEnum defaultFileType = AUFileTypeEnum.Entity)
        {
            string url = string.Empty;
            byte[] fileBinary = null;

            if (file != null)
                fileBinary = LoadFileBinary(file);

            if (file == null || fileBinary == null || fileBinary.Length == 0)
            {
                //TODO: phase I no default images for files
                //if (showDefaultPicture)
                //{
                //    url = GetDefaultPictureUrl(targetSize, defaultPictureType, storeLocation);
                //}

                return url;
            }
     

            string lastPart = GetFileExtensionFromMimeType(file.MimeType);

            if (file.IsNew)
            {
                //NJM: No thumbs for files
                //DeletePictureThumbs(picture);

                //we do not validate picture binary here to ensure that no exception ("Parameter is not valid") will be thrown
                file = UpdateFile(file.Id,
                    fileBinary,
                    file.MimeType,
                    //file.SeoFilename,
                    file.AltAttribute,
                    file.TitleAttribute,
                    false,
                    false);
            }

            //NJM: File name not used because it is not known at time upload button is hit
            //TODO: infer title from some aspect of document? 
            //string fileName = !String.IsNullOrEmpty(file.TitleAttribute) ?
            //           string.Format("{0}_{1}.{2}", file.Id.ToString("0000000"), file.TitleAttribute, lastPart) :
            //           string.Format("{0}.{1}", file.Id.ToString("0000000"), lastPart);

            string fileName = string.Format("{0}_0.{1}", file.Id.ToString("0000000"), lastPart);
            fileName = "AUConsignor" + fileName;

            //url = GetThumbUrl(fileName, storeLocation);
            url = storeLocation + "/content/files/" + fileName;
            return url;


            /*
            lock (s_lock)
            {
                //string seoFileName = picture.SeoFilename; // = GetPictureSeName(picture.SeoFilename); //just for sure
                string fileName = file.TitleAttribute; 

                if (targetSize == 0)
                {
                    thumbFileName = !String.IsNullOrEmpty(fileName) ?
                        string.Format("{0}_{1}.{2}", file.Id.ToString("0000000"), fileName, lastPart) :
                        string.Format("{0}.{1}", file.Id.ToString("0000000"), lastPart);

                    var thumbFilePath = GetThumbLocalPath(thumbFileName);

                    if (!File.Exists(thumbFilePath))
                    {
                        File.WriteAllBytes(thumbFilePath, pictureBinary);
                    }
                }
                else
                {
                    thumbFileName = !String.IsNullOrEmpty(seoFileName) ?
                        string.Format("{0}_{1}_{2}.{3}", picture.Id.ToString("0000000"), seoFileName, targetSize, lastPart) :
                        string.Format("{0}_{1}.{2}", picture.Id.ToString("0000000"), targetSize, lastPart);
                    var thumbFilePath = GetThumbLocalPath(thumbFileName);
                    if (!File.Exists(thumbFilePath))
                    {
                        using (var stream = new MemoryStream(pictureBinary))
                        {
                            Bitmap b = null;
                            try
                            {
                                //try-catch to ensure that picture binary is really OK. Otherwise, we can get "Parameter is not valid" exception if binary is corrupted for some reasons
                                b = new Bitmap(stream);
                            }
                            catch (ArgumentException exc)
                            {
                                _logger.Error(string.Format("Error generating picture thumb. ID={0}", picture.Id), exc);
                            }
                            if (b == null)
                            {
                                //bitmap could not be loaded for some reasons
                                return url;
                            }

                            using (var destStream = new MemoryStream())
                            {
                                var newSize = CalculateDimensions(b.Size, targetSize);
                                ImageBuilder.Current.Build(b, destStream, new ResizeSettings
                                {
                                    Width = newSize.Width,
                                    Height = newSize.Height,
                                    Scale = ScaleMode.Both,
                                    Quality = _mediaSettings.DefaultImageQuality
                                });
                                var destBinary = destStream.ToArray();
                                File.WriteAllBytes(thumbFilePath, destBinary);
                                b.Dispose();
                            }
                        }
                    }
                }
            }
            */

        }
        /// <summary>
        /// Delete a file from the file system
        /// </summary>
        /// <param name="AUFileRecord">File</param>
        protected virtual void DeleteFileOnFileSystem(AUFileRecord file)
        {
            if (file == null)
                throw new ArgumentNullException("file");

            string lastPart = GetFileExtensionFromMimeType(file.MimeType);
            string fileName = string.Format("{0}_0.{1}", file.Id.ToString("0000000"), lastPart);
            fileName = "AUConsignor" + fileName;
            string filePath = GetFileLocalPath(fileName);
            if (File.Exists(filePath))
            {
                File.Delete(filePath);
            }
        }
        /// <summary>
        /// Deletes a file
        /// </summary>
        /// <param name="AUFileRecord">File</param>
        public virtual void DeleteFile(AUFileRecord file)
        {
            if (file == null)
                throw new ArgumentNullException("file");

            //NJM: No need for files = delete thumbs
            //DeletePictureThumbs(picture);

            //NJM: always delete files from file system
            //if (!this.StoreInDb)
                DeleteFileOnFileSystem(file);

            //delete from database
            _fileRepo.Delete(file);

            //event notification
            _eventPublisher.EntityDeleted(file);
        }