/// <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; }
/// <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); } }
/// <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、如果原图超过一定尺寸(可以配置宽高像素值)则原图保留前先缩小(原图如果太大,裁剪时不方便操作)再保存 }
/// <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(); }
/// <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(); } }