Exemple #1
0
        /// <summary>
        /// 照片上传
        /// </summary>
        /// <param name="photo">照片对象</param>
        /// <param name="file">需上传的文件</param>
        private void UploadPhoto(Photo photo, HttpPostedFileBase file)
        {
            if (file == null)
            {
                throw new ExceptionFacade("请上传文件");
            }

            TenantAttachmentSettings tenantAttachmentSettings = TenantAttachmentSettings.GetRegisteredSettings(TenantTypeIds.Instance().Photo());

            //验证图片类型
            if (!tenantAttachmentSettings.ValidateFileExtensions(file.FileName))
            {
                throw new ExceptionFacade(string.Format("只允许上传后缀名为{0}的文件", tenantAttachmentSettings.AllowedFileExtensions));
            }

            //验证图片大小
            if (!tenantAttachmentSettings.ValidateFileLength(file.ContentLength))
            {
                throw new ExceptionFacade(string.Format("文件大小不允许超过{0}", tenantAttachmentSettings.MaxAttachmentLength));
            }

            IStoreProvider storeProvider = DIContainer.ResolveNamed <IStoreProvider>(tenantAttachmentSettings.StoreProviderName);

            //根据AlbumId生成图片存储路径和新的文件名
            string idString     = photo.AlbumId.ToString().PadLeft(15, '0');
            string relativePath = storeProvider.JoinDirectory(tenantAttachmentSettings.TenantAttachmentDirectory, idString.Substring(0, 5), idString.Substring(5, 5), idString.Substring(10, 5));
            string extension    = file.FileName.Substring(file.FileName.LastIndexOf('.') + 1).ToLower();
            string fileName     = string.Format("{0}.{1}", Guid.NewGuid().ToString("N"), extension);

            //上传原始图片
            using (Stream stream = file.InputStream)
            {
                storeProvider.AddOrUpdateFile(relativePath, fileName, stream);

                if (extension != "gif")
                {
                    //根据设置生成不同尺寸的图片
                    if (tenantAttachmentSettings.ImageSizeTypes != null)
                    {
                        foreach (var imageSizeType in tenantAttachmentSettings.ImageSizeTypes)
                        {
                            Stream resizedStream = ImageProcessor.Resize(stream, imageSizeType.Size.Width, imageSizeType.Size.Height, imageSizeType.ResizeMethod);
                            storeProvider.AddOrUpdateFile(relativePath, storeProvider.GetSizeImageName(fileName, imageSizeType.Size, imageSizeType.ResizeMethod), resizedStream);
                            if (resizedStream != stream)
                            {
                                resizedStream.Dispose();
                            }
                        }
                    }
                }
            }

            photo.RelativePath = relativePath + "\\" + fileName;
        }
Exemple #2
0
        /// <summary>
        /// 根据用户自己选择的尺寸及位置进行头像裁剪
        /// </summary>
        /// <param name="userId">用户Id</param>
        /// <param name="srcWidth">需裁剪的宽度</param>
        /// <param name="srcHeight">需裁剪的高度</param>
        /// <param name="srcX">需裁剪的左上角点坐标</param>
        /// <param name="srcY">需裁剪的左上角点坐标</param>
        public static void CropAvatar(this IUserService userService, long userId, float srcWidth, float srcHeight, float srcX, float srcY)
        {
            IStoreProvider storeProvider = DIContainer.Resolve <IStoreProvider>();
            IStoreFile     iStoreFile    = storeProvider.GetFile(GetAvatarRelativePath(userId), GetAvatarFileName(userId, AvatarSizeType.Original));

            if (iStoreFile == null)
            {
                return;
            }
            User user = GetFullUser(userService, userId);

            if (user == null)
            {
                return;
            }

            bool   isFirst            = !(user.Profile.IsUploadedAvatar);
            string avatarRelativePath = GetAvatarRelativePath(userId).Replace(Path.DirectorySeparatorChar, '/');

            avatarRelativePath = avatarRelativePath.Substring(AvatarDirectory.Length + 1);
            user.Avatar        = avatarRelativePath + "/" + userId;

            IUserRepository userRepository = userService.GetUserRepository();

            userRepository.UpdateAvatar(user, user.Avatar);

            UserProfileSettings userProfileSettings = DIContainer.Resolve <ISettingsManager <UserProfileSettings> >().Get();

            using (Stream fileStream = iStoreFile.OpenReadStream())
            {
                Stream bigImage = ImageProcessor.Crop(fileStream, new Rectangle((int)srcX, (int)srcY, (int)srcWidth, (int)srcHeight), userProfileSettings.AvatarWidth, userProfileSettings.AvatarHeight);

                Stream smallImage = ImageProcessor.Resize(bigImage, userProfileSettings.SmallAvatarWidth, userProfileSettings.SmallAvatarHeight, ResizeMethod.KeepAspectRatio);
                storeProvider.AddOrUpdateFile(GetAvatarRelativePath(userId), GetAvatarFileName(userId, AvatarSizeType.Big), bigImage);
                storeProvider.AddOrUpdateFile(GetAvatarRelativePath(userId), GetAvatarFileName(userId, AvatarSizeType.Small), smallImage);

                bigImage.Dispose();
                smallImage.Dispose();
                fileStream.Close();
            }

            //触发用户更新头像事件
            EventBus <User, CropAvatarEventArgs> .Instance().OnAfter(user, new CropAvatarEventArgs(isFirst));

            if (isFirst)
            {
                user.Profile.IsUploadedAvatar = true;
                new UserProfileService().Update(user.Profile);
            }
        }
Exemple #3
0
        /// <summary>
        /// 上传头像
        /// </summary>
        /// <param name="userId">用户ID</param>
        /// <param name="postedFile">上传的二进制头像文件</param>
        public static void UploadOriginalAvatar(this IUserService userService, long userId, Stream postedFile)
        {
            if (postedFile == null)
            {
                return;
            }
            Image image = Image.FromStream(postedFile);

            IUserProfileSettingsManager userProfileSettingsManager = DIContainer.Resolve <IUserProfileSettingsManager>();
            UserProfileSettings         userProfileSettings        = userProfileSettingsManager.GetUserProfileSettings();

            //检查是否需要缩放原图
            if (image.Height > userProfileSettings.OriginalAvatarHeight || image.Width > userProfileSettings.OriginalAvatarWidth)
            {
                postedFile = ImageProcessor.Resize(postedFile, userProfileSettings.OriginalAvatarWidth, userProfileSettings.OriginalAvatarHeight, ResizeMethod.KeepAspectRatio);
            }

            string relativePath = GetAvatarRelativePath(userId);

            IStoreProvider storeProvider = DIContainer.Resolve <IStoreProvider>();

            storeProvider.AddOrUpdateFile(relativePath, GetAvatarFileName(userId, AvatarSizeType.Original), postedFile);
            postedFile.Dispose();
            //1、如果原图超过一定尺寸(可以配置宽高像素值)则原图保留前先缩小(原图如果太大,裁剪时不方便操作)再保存
        }
Exemple #4
0
        /// <summary>
        /// 上传背景图片
        /// </summary>
        /// <param name="presentAreaKey">呈现区域标识</param>
        /// <param name="ownerId">OwnerId</param>
        /// <param name="postedFile">上传的图片文件流</param>
        public void UploadBackgroundImage(string presentAreaKey, long ownerId, Stream postedFile)
        {
            if (postedFile == null)
            {
                return;
            }

            IStoreProvider storeProvider = DIContainer.Resolve <IStoreProvider>();

            storeProvider.AddOrUpdateFile(GetBackgroundImageRelativePath(presentAreaKey, ownerId), GetBackgroundImageFileName(ownerId), postedFile);
            postedFile.Dispose();
        }
Exemple #5
0
        /// <summary>
        /// 设置不同尺寸的用户头像
        /// </summary>
        /// <param name="userId"></param>
        private void SetUserAvatars(long userId)
        {
            IStoreFile iStoreFile = storeProvider.GetFile(GetRelativePathById(userId, "Avatars"), userId + "_big.jpg");

            if (iStoreFile == null)
            {
                return;
            }
            using (Stream fileStream = iStoreFile.OpenReadStream())
            {
                Stream bigImage   = ImageProcessor.Crop(fileStream, new Rectangle(0, 0, 160, 160), 160, 160);
                Stream smallImage = ImageProcessor.Resize(bigImage, 50, 50, ResizeMethod.KeepAspectRatio);
                storeProvider.AddOrUpdateFile(GetRelativePathById(userId, "Avatars"), userId + ".jpg", smallImage);

                bigImage.Dispose();
                smallImage.Dispose();
                fileStream.Close();
            }
        }