From c2a9d07772132fbddfe05849b12ffe4c9400caca Mon Sep 17 00:00:00 2001 From: ShiYu Date: Sat, 24 May 2025 11:41:06 +0800 Subject: [PATCH] feat(upload): remove image format conversion options #6 - Remove image format conversion and quality settings from the upload dialog - Update backend to use default format and quality settings - Add system configuration options for default image format and quality --- Api/PictureController.cs | 5 +- .../Request/Picture/UploadPictureRequest.cs | 11 --- Services/Media/IPictureService.cs | 4 +- Services/Media/PictureService.cs | 32 ++++--- Web/src/api/pictureApi.ts | 10 --- .../components/upload/ImageUploadDialog.tsx | 84 ++----------------- Web/src/pages/settings/SystemConfig.tsx | 84 +++++++++++++++++++ 7 files changed, 116 insertions(+), 114 deletions(-) diff --git a/Api/PictureController.cs b/Api/PictureController.cs index 66a46e7..a5ace00 100644 --- a/Api/PictureController.cs +++ b/Api/PictureController.cs @@ -74,7 +74,6 @@ public class PictureController(IPictureService pictureService, IConfigService co try { var userId = GetCurrentUserId(); - await using var stream = request.File.OpenReadStream(); var result = await pictureService.UploadPictureAsync( request.File.FileName, @@ -83,9 +82,7 @@ public class PictureController(IPictureService pictureService, IConfigService co userId, (PermissionType)request.Permission!, request.AlbumId, - request.StorageType, - request.ConvertToFormat, - request.Quality + request.StorageType ); var picture = result.Picture; diff --git a/Models/Request/Picture/UploadPictureRequest.cs b/Models/Request/Picture/UploadPictureRequest.cs index 908edfd..d92d24e 100644 --- a/Models/Request/Picture/UploadPictureRequest.cs +++ b/Models/Request/Picture/UploadPictureRequest.cs @@ -16,15 +16,4 @@ public record UploadPictureRequest public int? AlbumId { get; set; } public StorageType? StorageType { get; set; } - - /// - /// 目标图片格式,默认为保持原格式 - /// - public ImageFormat ConvertToFormat { get; set; } = ImageFormat.Original; - - /// - /// 图片质量(仅对JPEG和WebP有效,1-100) - /// - [Range(1, 100, ErrorMessage = "图片质量必须在1-100之间")] - public int Quality { get; set; } = 95; } \ No newline at end of file diff --git a/Services/Media/IPictureService.cs b/Services/Media/IPictureService.cs index 6ed9472..88a031f 100644 --- a/Services/Media/IPictureService.cs +++ b/Services/Media/IPictureService.cs @@ -34,9 +34,7 @@ public interface IPictureService int? userId, PermissionType permission = PermissionType.Public, int? albumId = null, - StorageType? storageType = null, - ImageFormat convertToFormat = ImageFormat.Original, - int quality = 95 + StorageType? storageType = null ); Task GetPictureExifInfoAsync(int pictureId); diff --git a/Services/Media/PictureService.cs b/Services/Media/PictureService.cs index f7477ed..d4d32d5 100644 --- a/Services/Media/PictureService.cs +++ b/Services/Media/PictureService.cs @@ -437,19 +437,17 @@ public class PictureService( int? userId, PermissionType permission = PermissionType.Public, int? albumId = null, - StorageType? storageType = null, - ImageFormat convertToFormat = ImageFormat.Original, - int quality = 95) + StorageType? storageType = null) { StorageType GetConfigStorageType(string configKey) { string? configValue = configuration[configKey]; - return !string.IsNullOrEmpty(configValue) && + return !string.IsNullOrEmpty(configValue) && Enum.TryParse(configValue, out var configStorageType) - ? configStorageType + ? configStorageType : StorageType.Local; } - + if (userId == null) { storageType = GetConfigStorageType("Storage:AnonymousDefaultStorage"); @@ -458,7 +456,21 @@ public class PictureService( { storageType = GetConfigStorageType("Storage:DefaultStorage"); } - + ImageFormat convertToFormat = ImageFormat.Original; + string defaultFormatConfig = configuration["Upload:DefaultImageFormat"]; + if (!string.IsNullOrEmpty(defaultFormatConfig)) + { + if (Enum.TryParse(defaultFormatConfig, true, out var parsedFormat)) + { + convertToFormat = parsedFormat; + } + } + int quality = 100; + string defaultQualityConfig = configuration["Upload:DefaultImageQuality"]; + if (!string.IsNullOrEmpty(defaultQualityConfig)) + { + quality = int.Parse(defaultQualityConfig); + } string originalFileName = fileName; string finalFileName = fileName; string finalContentType = contentType; @@ -553,7 +565,7 @@ public class PictureService( AlbumId = albumId, StorageType = storageType.Value, ProcessingStatus = isAnonymous ? ProcessingStatus.Completed : ProcessingStatus.Pending, - ThumbnailPath = isAnonymous ? relativePath : null + ThumbnailPath = isAnonymous ? relativePath : null }; dbContext.Pictures.Add(picture); @@ -570,7 +582,7 @@ public class PictureService( Id = picture.Id, Name = picture.Name, Path = storageService.GetUrl(picture.StorageType, relativePath), - ThumbnailPath = isAnonymous ? storageService.GetUrl(picture.StorageType, relativePath) : null, + ThumbnailPath = isAnonymous ? storageService.GetUrl(picture.StorageType, relativePath) : null, Description = picture.Description, CreatedAt = picture.CreatedAt, Tags = new List(), @@ -590,7 +602,7 @@ public class PictureService( string tempFilePath = tempFileStream.Name; finalStream.Dispose(); if (File.Exists(tempFilePath)) File.Delete(tempFilePath); - + // 同时清理原始临时文件 string tempOriginalFile = Path.ChangeExtension(tempFilePath, null); if (File.Exists(tempOriginalFile)) File.Delete(tempOriginalFile); diff --git a/Web/src/api/pictureApi.ts b/Web/src/api/pictureApi.ts index 3f4cb07..8ae62ed 100644 --- a/Web/src/api/pictureApi.ts +++ b/Web/src/api/pictureApi.ts @@ -119,8 +119,6 @@ export async function uploadPicture( data: { permission?: number; albumId?: number; - convertToFormat?: string; - quality?: number; onProgress?: (percent: number) => void } = {} ): Promise> { @@ -135,14 +133,6 @@ export async function uploadPicture( formData.append('albumId', data.albumId.toString()); } - if (data.convertToFormat !== undefined) { - formData.append('convertToFormat', data.convertToFormat.toString()); - } - - if (data.quality !== undefined) { - formData.append('quality', data.quality.toString()); - } - try { const token = localStorage.getItem('token'); const headers: Record = {}; diff --git a/Web/src/components/upload/ImageUploadDialog.tsx b/Web/src/components/upload/ImageUploadDialog.tsx index 774e4f7..ef41576 100644 --- a/Web/src/components/upload/ImageUploadDialog.tsx +++ b/Web/src/components/upload/ImageUploadDialog.tsx @@ -1,9 +1,9 @@ import React, { useState, useEffect } from 'react'; -import { Modal, Upload, Button, Progress, message, Form, Select, Radio, Slider, Divider, Alert } from 'antd'; +import { Modal, Upload, Button, Progress, message, Form, Select, Radio, Slider } from 'antd'; import { InboxOutlined } from '@ant-design/icons'; import { v4 as uuidv4 } from 'uuid'; import type { UploadFile, AlbumResponse } from '../../api'; -import { uploadPicture, getAlbums, ImageFormat } from '../../api'; +import { uploadPicture, getAlbums } from '../../api'; const { Dragger } = Upload; const { Option } = Select; @@ -20,8 +20,6 @@ const ImageUploadDialog: React.FC = ({ visible, onClose, onUp const [form] = Form.useForm(); const [albums, setAlbums] = useState([]); const [concurrentUploads, setConcurrentUploads] = useState(3); - const [convertFormat, setConvertFormat] = useState(ImageFormat.Original); - const [quality, setQuality] = useState(95); useEffect(() => { if (visible) { @@ -77,11 +75,9 @@ const ImageUploadDialog: React.FC = ({ visible, onClose, onUp setUploading(true); const values = await form.validateFields(); - const params: { // 修改此处的类型定义 + const params: { permission?: number; albumId?: number; - convertToFormat?: string; // 允许 string 类型 - quality?: number; } = {}; if (values.permission !== undefined) { @@ -90,10 +86,6 @@ const ImageUploadDialog: React.FC = ({ visible, onClose, onUp if (values.albumId) { params.albumId = values.albumId; } - if (convertFormat !== ImageFormat.Original) { - params.convertToFormat = convertFormat.toString(); // 现在类型匹配 - params.quality = quality; - } let successCount = 0; let failCount = 0; @@ -110,7 +102,7 @@ const ImageUploadDialog: React.FC = ({ visible, onClose, onUp try { // 上传文件 - const result = await uploadPicture(item.file, { // 此处 params 类型现在匹配 + const result = await uploadPicture(item.file, { ...params, onProgress: (percent) => { setUploadQueue((prev) => @@ -217,17 +209,6 @@ const ImageUploadDialog: React.FC = ({ visible, onClose, onUp } }; - // 获取格式名称 - const getFormatName = (format: ImageFormat) => { - switch (format) { - case ImageFormat.Original: return '保持原格式'; - case ImageFormat.Jpeg: return 'JPEG'; - case ImageFormat.Png: return 'PNG'; - case ImageFormat.WebP: return 'WebP'; - default: return '未知格式'; - } - }; - // 自定义上传列表项 const renderUploadItem = (item: UploadFile) => { let statusIcon; @@ -361,51 +342,6 @@ const ImageUploadDialog: React.FC = ({ visible, onClose, onUp 仅自己 - - 格式转换设置 - - - setConvertFormat(e.target.value)} - optionType="button" - buttonStyle="solid" - style={{ display: 'flex', flexWrap: 'wrap', gap: '8px' }} - > - 保持原格式 - JPEG (.jpg) - PNG (.png) - WebP (.webp) - - - - {convertFormat !== ImageFormat.Original && ( - <> - {convertFormat === ImageFormat.Png ? ( - - ) : ( - - `${value}%` }} - /> -
- 质量越高文件越大,建议使用 85-95% 的质量设置 -
-
- )} - - )} = ({ visible, onClose, onUp

点击或拖拽图片到此区域上传

支持单个或批量上传,图片大小不超过10MB - {convertFormat !== ImageFormat.Original && ( - <> -
- - 将转换为 {getFormatName(convertFormat)} 格式 - - - )} +
+ + 图片将按系统默认设置进行处理 +

diff --git a/Web/src/pages/settings/SystemConfig.tsx b/Web/src/pages/settings/SystemConfig.tsx index 0fa0ec1..a1547ac 100644 --- a/Web/src/pages/settings/SystemConfig.tsx +++ b/Web/src/pages/settings/SystemConfig.tsx @@ -391,6 +391,90 @@ const SystemConfig: React.FC = () => { + {/* 上传设置卡片 - 新增 */} + +
+ {/* 图片默认格式 */} +
+
+ 默认图片格式 +
+ +
+ 上传图片时的默认处理格式,选择合适的格式可以优化存储和显示 +
+
+ + {/* 图片压缩质量 */} +
+
+ 默认压缩质量 +
+ +
+ 适用于JPEG和WebP格式的图片质量设置,越高图片质量越好但文件越大 +
+
+
+
+ {/* 存储服务配置卡片 */}