| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # æä»¶ä¸ä¼ åè½è¯´æ |
| | | |
| | | æ¬ææ¡£åºäºä»¥ä¸ä»£ç æ´çï¼ |
| | | |
| | | - `src/main/java/com/ruoyi/basic/utils/FileUtil.java` |
| | | - `src/main/java/com/ruoyi/basic/enums/ApplicationTypeEnum.java` |
| | | - `src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java` |
| | | - `src/main/java/com/ruoyi/project/common/CommonController.java` |
| | | - `src/main/java/com/ruoyi/basic/controller/StorageAttachmentController.java` |
| | | |
| | | ç¨äºè¯´ææ¬é¡¹ç®ä¸æä»¶ä¸ä¼ ãéä»¶ç»å®ãæä»¶é¢è§/ä¸è½½çæ´ä½è®¾è®¡ï¼ä»¥å `FileUtil` 䏿¯ä¸ªæ¹æ³çä½ç¨ã |
| | | |
| | | ## 1. æ´ä½è®¾è®¡ |
| | | |
| | | æ¬é¡¹ç®çæä»¶ä½ç³»åæä¸¤å±ï¼ |
| | | |
| | | - `storage_blob`ï¼åæä»¶å®ä½ä¿¡æ¯ |
| | | - åå§æä»¶å |
| | | - å¯ä¸æä»¶å `uidFilename` |
| | | - æä»¶è·¯å¾ `path` |
| | | - æä»¶å¤§å° `byteSize` |
| | | - æä»¶ç±»å `contentType` |
| | | - å
Œ
±è®¿é®æ è¯ `resourceKey` |
| | | - `storage_attachment`ï¼åæä»¶åä¸å¡è®°å½çå
³èå
³ç³» |
| | | - `application`ï¼æä»¶ç¨é |
| | | - `recordType`ï¼ä¸å¡è®°å½ç±»å |
| | | - `recordId`ï¼ä¸å¡è®°å½ä¸»é® |
| | | - `storageBlobId`ï¼å
³èçæä»¶ä¸»è¡¨ id |
| | | |
| | | å¯ä»¥çè§£ä¸ºï¼ |
| | | |
| | | - `storage_blob` è´è´£âæä»¶æ¬èº«â |
| | | - `storage_attachment` è´è´£âæä»¶æå¨åªæ¡ä¸å¡æ°æ®ä¸â |
| | | |
| | | ## 2. ä¸ä¼ æµç¨ |
| | | |
| | | ### 2.1 æ®éä¸ä¼ |
| | | |
| | | æ¥å£ï¼ |
| | | |
| | | - `POST /common/upload` |
| | | |
| | | æ§å¶å¨ä½ç½®ï¼ |
| | | |
| | | - `src/main/java/com/ruoyi/project/common/CommonController.java` |
| | | |
| | | å
¥åï¼ |
| | | |
| | | - 表ååæ®µåï¼`files` |
| | | - ç±»åï¼`List<MultipartFile>` |
| | | |
| | | 代ç é»è¾ï¼ |
| | | |
| | | 1. å端å
è°ç¨ `/common/upload` |
| | | 2. `CommonController.upload()` è°ç¨ `storageBlobService.upload(files, false)` |
| | | 3. æå¡å±ä¿åæä»¶å
æ°æ®å° `storage_blob` |
| | | 4. è¿å `StorageBlobVO` å表ï¼éé¢é常ä¼å¸¦ï¼ |
| | | - æä»¶ id |
| | | - åå§æä»¶å |
| | | - å¯ä¸æä»¶å |
| | | - é¢è§å°å `previewURL` |
| | | - ä¸è½½å°å `downloadURL` |
| | | |
| | | 说æï¼ |
| | | |
| | | - æ¤æ¶åªæ¯âä¸ä¼ äºæä»¶â |
| | | - è¿æ²¡æåå
·ä½ä¸å¡åæ®å»ºç«å
³ç³» |
| | | |
| | | ### 2.2 å
Œ
±ä¸ä¼ |
| | | |
| | | æ¥å£ï¼ |
| | | |
| | | - `POST /common/public/upload` |
| | | |
| | | 代ç é»è¾ï¼ |
| | | |
| | | - `CommonController.publicUpload()` è°ç¨ `storageBlobService.upload(files, true)` |
| | | |
| | | 说æï¼ |
| | | |
| | | - 该æ¥å£ä¸ä¼ çæä»¶èµ°âå
Œ
±æä»¶âæ¨¡å¼ |
| | | - æ§å¶å¨æ³¨éå·²æç¡®è¯´æï¼æ°¸ä¹
ææï¼æ
ç¨ |
| | | - å¯¹åº URL æå»ºæ¶ï¼å¯è½èµ° `publicKey` åæ°ï¼è䏿¯ä¸´æ¶ `token` |
| | | |
| | | ## 3. éä»¶ç»å®æµç¨ |
| | | |
| | | ä¸ä¼ 宿åï¼å¦æéè¦ææä»¶ç»å®å°ææ¡ä¸å¡è®°å½ï¼éè¦åè°ç¨éä»¶æ¥å£ã |
| | | |
| | | æ¥å£ï¼ |
| | | |
| | | - `POST /storageAttachment/add` |
| | | |
| | | æ§å¶å¨ä½ç½®ï¼ |
| | | |
| | | - `src/main/java/com/ruoyi/basic/controller/StorageAttachmentController.java` |
| | | |
| | | æ ¸å¿è¯·æ±å¯¹è±¡ï¼ |
| | | |
| | | - `StorageAttachmentDTO` |
| | | |
| | | å
¶ä¸ç»§æ¿äº `StorageAttachment`ï¼å¹¶é¢å¤å
å«ï¼ |
| | | |
| | | - `storageBlobDTOs`ï¼å¾
ç»å®çæä»¶å表 |
| | | |
| | | 常ç¨å段å«ä¹ï¼ |
| | | |
| | | - `application`ï¼æä»¶ç¨é |
| | | - `recordType`ï¼ä¸å¡ç±»å |
| | | - `recordId`ï¼ä¸å¡ä¸»é® |
| | | - `storageBlobDTOs[].id`ï¼ä¸ä¼ æååè¿åçæä»¶ id |
| | | |
| | | 示ä¾è¯·æ±ä½ï¼ |
| | | |
| | | ```json |
| | | { |
| | | "application": "file", |
| | | "recordType": "common_file", |
| | | "recordId": 1001, |
| | | "storageBlobDTOs": [ |
| | | { |
| | | "id": 12, |
| | | "application": "file" |
| | | }, |
| | | { |
| | | "id": 13, |
| | | "application": "file" |
| | | } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | ç»å®é»è¾è¯´æï¼ |
| | | |
| | | 1. å
ä¸ä¼ æä»¶ï¼æ¿å° `storage_blob.id` |
| | | 2. åè°ç¨ `/storageAttachment/add` |
| | | 3. æå¡å±æç»ä¼éè¿ `FileUtil` ä¿å `storage_attachment` |
| | | 4. åç»å³å¯æä¸å¡è®°å½æ¥è¯¢åºè¯¥è®°å½ä¸çéä»¶ |
| | | |
| | | ## 4. æ¥è¯¢ä¸å é¤éä»¶ |
| | | |
| | | ### 4.1 æ¥è¯¢éä»¶å表 |
| | | |
| | | æ¥å£ï¼ |
| | | |
| | | - `GET /storageAttachment/list` |
| | | |
| | | 说æï¼ |
| | | |
| | | - æ `StorageAttachmentDTO` ä¸çæ¡ä»¶æ¥è¯¢ |
| | | - å¸¸è§æ¡ä»¶æ¯ `application`ã`recordType`ã`recordId` |
| | | - è¿åç»ææ¬è´¨ä¸æ¯åä¸å¡è®°å½å
³èåçæä»¶å表 |
| | | |
| | | ### 4.2 å é¤éä»¶ |
| | | |
| | | æ¥å£ï¼ |
| | | |
| | | - `DELETE /storageAttachment/delete` |
| | | |
| | | 请æ±ä½ï¼ |
| | | |
| | | - `List<Long> ids` |
| | | |
| | | 说æï¼ |
| | | |
| | | - è¿éç `ids` æ¯éä»¶å
³è表 idï¼ä¸è¬æ¯ `storage_attachment.id` |
| | | - å 餿¶é常ä¸ä»
ä¼å å
³èå
³ç³»ï¼ä¹ä¼è¿ä¸æ¥å é¤å¯¹åºæä»¶è®°å½ |
| | | |
| | | ## 5. é¢è§ä¸ä¸è½½æµç¨ |
| | | |
| | | ### 5.1 ä¸è½½æ¥å£ |
| | | |
| | | æ¥å£ï¼ |
| | | |
| | | - `GET /common/download/{fileName}` |
| | | |
| | | æ¯æä¸¤ç§è®¿é®æ¹å¼ï¼ |
| | | |
| | | - 临æ¶é¾æ¥ï¼`token` |
| | | - å
Œ
±é¾æ¥ï¼`publicKey` |
| | | |
| | | 代ç é»è¾ï¼ |
| | | |
| | | 1. å¦æè¯·æ±éæ `publicKey`ï¼èµ° `storageBlobService.getPublicFile(fileName, publicKey)` |
| | | 2. å¦åèµ° `storageBlobService.getFileByToken(fileName, token)` |
| | | 3. åå°å®é
æä»¶åï¼è°ç¨ `fileUtil.compressFile(file)` åå¾çå缩å¤ç |
| | | 4. 设置ä¸è½½ååºå¤´ï¼è¾åºæä»¶æµ |
| | | |
| | | ### 5.2 é¢è§æ¥å£ |
| | | |
| | | æ¥å£ï¼ |
| | | |
| | | - `GET /common/preview/{fileName}` |
| | | |
| | | æ¯æä¸¤ç§è®¿é®æ¹å¼ï¼ |
| | | |
| | | - 临æ¶é¾æ¥ï¼`token` |
| | | - å
Œ
±é¾æ¥ï¼`publicKey` |
| | | |
| | | 代ç é»è¾ï¼ |
| | | |
| | | 1. æ ¡éª `token` æ `publicKey` |
| | | 2. è·åæä»¶ |
| | | 3. è°ç¨ `fileUtil.compressFile(file)` |
| | | 4. æ ¹æ®æä»¶å
容类åè¿å inline é¢è§ |
| | | |
| | | ## 6. æä¸¾å«ä¹ |
| | | |
| | | ### 6.1 `ApplicationTypeEnum` |
| | | |
| | | ä½ç½®ï¼ |
| | | |
| | | - `src/main/java/com/ruoyi/basic/enums/ApplicationTypeEnum.java` |
| | | |
| | | å½åå®ä¹å¼ï¼ |
| | | |
| | | | æä¸¾ | type | 说æ | |
| | | |---|---|---| |
| | | | `IMAGE` | `image` | å¾çç±»æä»¶ | |
| | | | `FILE` | `file` | æ®éæä»¶ | |
| | | | `AFTER_FILE` | `after_file` | å®åç¸å
³æä»¶ | |
| | | | `BEFORE_FILE` | `before_file` | å®å/åç½®ç¸å
³æä»¶ | |
| | | | `APK` | `apk` | å®è£
å
æä»¶ | |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - ç¨äºåºåå䏿¡ä¸å¡è®°å½ä¸ï¼ä¸åç¨éçæä»¶ |
| | | - `FileUtil` çå¾å¤æ¥è¯¢ãå é¤ãä¿åæ¹æ³é½ä¼ç¨å°è¯¥å段 |
| | | |
| | | ### 6.2 `RecordTypeEnum` |
| | | |
| | | ä½ç½®ï¼ |
| | | |
| | | - `src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - ç¨äºæ è®°æä»¶å±äºåªç±»ä¸å¡è®°å½ |
| | | - ä¾å¦è´¨æ£ãéè´ã客æ·ãå®åãå°è´¦ãéç¥ã设å¤ç模å |
| | | - ä¸ä¼ 宿åï¼éä»¶æç»éè¿ `recordType + recordId` åä¸å¡æ°æ®å
³è |
| | | |
| | | 说æï¼ |
| | | |
| | | - 该æä¸¾å¼å¾å¤ï¼ææ¡£ä¸é个å±å¼ |
| | | - å®é
ä½¿ç¨æ¶å¿
é¡»ä¼ ä»£ç ä¸å·²å®ä¹ç `type` å¼ |
| | | - å¦ï¼ |
| | | - `common_file` |
| | | - `after_sales_service` |
| | | - `quality_inspect` |
| | | - `product` |
| | | - `notice` |
| | | |
| | | ## 7. `FileUtil` æ¹æ³è¯´æ |
| | | |
| | | `FileUtil` æ¯æ¬å¥æä»¶ä¸ä¼ ä½ç³»çæ ¸å¿å·¥å
·ç±»ï¼ä¸»è¦è´è´£ï¼ |
| | | |
| | | - æä»¶ä¸ä¸å¡è®°å½ç»å® |
| | | - æä»¶ä¸éä»¶å é¤ |
| | | - éä»¶æ¥è¯¢ |
| | | - é¢è§/ä¸è½½å°åçæ |
| | | - token ä½¿ç¨æ¬¡æ°æ§å¶ |
| | | - å¾çå缩 |
| | | |
| | | ä¸é¢æåè½åç»è¯´ææ¯ä¸ªæ¹æ³ã |
| | | |
| | | ### 7.1 ä¿åéä»¶å
³ç³» |
| | | |
| | | #### 1. `saveStorageAttachment(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId, List<StorageBlobDTO> storageBlobDTOS)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æâæä»¶ç¨é + è®°å½ç±»å + è®°å½ idâä¿åéä»¶å
³ç³» |
| | | |
| | | é»è¾ï¼ |
| | | |
| | | 1. æ ¡éª `application`ã`recordType`ã`recordId` |
| | | 2. å
å é¤è¿ç»ä¸å¡è®°å½ä¸çæ§éä»¶ |
| | | 3. ææ°ç `storageBlobDTOS` 转æ `storage_attachment` è®°å½åæ¹éæå
¥ |
| | | |
| | | éç¨åºæ¯ï¼ |
| | | |
| | | - ææ¡ä¸å¡æ°æ®éæ°ä¿åéä»¶ï¼æ§éä»¶æ´ä½æ¿æ¢ææ°éä»¶ |
| | | |
| | | #### 2. `saveStorageAttachmentByRecordTypeAndRecordId(String application, RecordTypeEnum recordType, Long recordId, List<StorageBlobDTO> storageBlobDTOS)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æ `recordType + recordId` ä¿åéä»¶å
³ç³»ï¼`application` 坿å®ï¼ä¹å¯ä»æ¯ä¸ªæä»¶å¯¹è±¡é读å |
| | | |
| | | é»è¾ç¹ç¹ï¼ |
| | | |
| | | - 妿 `application == null`ï¼ä¼æ ¹æ® `storageBlobDTO.application` åå«å 餿§å
³ç³» |
| | | - 妿éä»¶å表为空ï¼ä¼ç´æ¥å é¤è¯¥ä¸å¡è®°å½çéä»¶å
³ç³» |
| | | - æå
¥æ¶ä¼èªå¨åå¡« `application` |
| | | |
| | | éç¨åºæ¯ï¼ |
| | | |
| | | - 䏿¬¡æäº¤éå¯è½å
å«å¤ç§ç¨éçéä»¶ |
| | | - æè
è°ç¨æ¹ä¸æ¹ä¾¿ç´æ¥ä¼ æä¸¾ç±»å |
| | | |
| | | ### 7.2 å é¤æä»¶ä¸»è¡¨ `storage_blob` |
| | | |
| | | #### 3. `deleteStorageBlobs(List<Long> storageBlobIds)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - ææä»¶ä¸»è¡¨ id æ¹éå é¤æä»¶è®°å½ |
| | | |
| | | #### 4. `deleteStorageBlobsByStorageAttachmentIds(List<Long> storageAttachmentIds)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - å
æ ¹æ®éä»¶å
³è id æ¥å° `storageBlobId` |
| | | - åå é¤å¯¹åºçæä»¶ä¸»è¡¨è®°å½ |
| | | |
| | | #### 5. `deleteStorageBlobsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum application, RecordTypeEnum recordType, List<Long> recordIds)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æ ¹æ®ç¨éãè®°å½ç±»åãå¤ä¸ªä¸å¡ idï¼æ¹éå é¤å¯¹åºçæä»¶ä¸»è¡¨è®°å½ |
| | | |
| | | éç¨åºæ¯ï¼ |
| | | |
| | | - æ¹éå é¤æç±»ä¸å¡æ°æ®æ¶ï¼åæ¶æ¸
çéä»¶ |
| | | |
| | | #### 6. `deleteStorageBlobsByRecordTypeAndRecordId(RecordTypeEnum recordType, Long recordId)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æ ¹æ® `recordType + recordId` å é¤è¯¥ä¸å¡è®°å½ä¸æææä»¶ä¸»è¡¨è®°å½ |
| | | |
| | | ### 7.3 å é¤éä»¶å
³ç³» `storage_attachment` |
| | | |
| | | #### 7. `deleteStorageAttachmentsByStorageAttachmentIds(List<Long> storageAttachmentIds)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - å
å é¤é件对åºçæä»¶ä¸»è¡¨è®°å½ |
| | | - åå é¤éä»¶å
³ç³»è¡¨è®°å½ |
| | | |
| | | #### 8. `deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - å 餿å®ç¨éãæå®ä¸å¡è®°å½ä¸çéä»¶å
³ç³» |
| | | |
| | | ç¹ç¹ï¼ |
| | | |
| | | - ä¼å
å blobï¼åå attachment |
| | | |
| | | #### 9. `deleteStorageAttachmentsByRecordTypeAndRecordId(RecordTypeEnum recordType, Long recordId)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - å 餿å®ä¸å¡è®°å½ä¸å
¨é¨éä»¶å
³ç³»ï¼ä¸åºåç¨é |
| | | |
| | | #### 10. `deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum application, RecordTypeEnum recordType, List<Long> recordIds)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æå¤ä¸ªä¸å¡ id æ¹éå é¤éä»¶å
³ç³» |
| | | |
| | | ### 7.4 æ¥è¯¢éä»¶å
³ç³» |
| | | |
| | | #### 11. `getStorageAttachmentsByStorageAttachmentIds(List<Long> storageAttachmentIds)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æ ¹æ®éä»¶å
³ç³» id æ¥è¯¢ `storage_attachment` è®°å½ |
| | | |
| | | #### 12. `getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æç¨éãä¸å¡ç±»åãä¸å¡ id æ¥è¯¢éä»¶å
³ç³» |
| | | |
| | | #### 13. `getStorageAttachmentsByRecordTypeAndRecordId(RecordTypeEnum recordType, Long recordId)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æä¸å¡ç±»åãä¸å¡ id æ¥è¯¢éä»¶å
³ç³» |
| | | |
| | | ### 7.5 æ¥è¯¢æä»¶ä¿¡æ¯ `StorageBlobVO` |
| | | |
| | | #### 14. `getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(StorageAttachmentDTO storageAttachmentDTO)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - éè¿ `StorageAttachmentDTO` æ¡ä»¶æ¥è¯¢æä»¶å表 |
| | | |
| | | ç¹ç¹ï¼ |
| | | |
| | | - `application` å¯é |
| | | - æç»è¿åçæ¯å¸¦é¢è§/ä¸è½½å°åç `StorageBlobVO` |
| | | |
| | | #### 15. `getStorageBlobVOsByStorageAttachmentIds(List<Long> storageAttachmentIds)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æ ¹æ®éä»¶å
³ç³» id æ¥è¯¢æä»¶å表 |
| | | |
| | | ç¹ç¹ï¼ |
| | | |
| | | - ä¼èªå¨æå»ºï¼ |
| | | - `previewURL` |
| | | - `downloadURL` |
| | | - `storageAttachmentId` |
| | | |
| | | #### 16. `getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æç¨éãä¸å¡ç±»åãä¸å¡ id æ¥è¯¢æä»¶å表 |
| | | |
| | | #### 17. `getStorageBlobVOsByRecordTypeAndRecordId(RecordTypeEnum recordType, Long recordId)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æä¸å¡ç±»åãä¸å¡ id æ¥è¯¢æä»¶å表 |
| | | |
| | | #### 18. `getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId, BigDecimal expired)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - å第 16 ä¸ªæ¹æ³ç±»ä¼¼ï¼ä½å¯ä»¥èªå®ä¹é¾æ¥è¿ææ¶é´ |
| | | |
| | | 说æï¼ |
| | | |
| | | - `expired` å使¯åé |
| | | - è¿åçé¢è§/ä¸è½½å°å伿è¿ä¸ªæ¶é´çæç¾å |
| | | |
| | | #### 19. `getStorageBlobVOsByStorageAttachmentIds(List<Long> storageAttachmentIds, BigDecimal expired)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æ ¹æ®éä»¶å
³ç³» id æ¥è¯¢æä»¶å表ï¼å¹¶èªå®ä¹é¾æ¥è¿ææ¶é´ |
| | | |
| | | ### 7.6 æ¥è¯¢éä»¶è§å¾ `StorageAttachmentVO` |
| | | |
| | | #### 20. `getStorageAttachmentVOSByStorageAttachmentIds(List<Long> storageAttachmentIds)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æ¥è¯¢éä»¶è§å¾å¯¹è±¡ |
| | | |
| | | ç¹ç¹ï¼ |
| | | |
| | | - æ¯æ¡éä»¶è®°å½éä¼åµå¥èªå·±ç `storageBlobVOS` |
| | | |
| | | #### 21. `getStorageAttachmentVOSByStorageAttachmentIds(List<Long> storageAttachmentIds, BigDecimal expired)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æ ¹æ®éä»¶å
³ç³» id æ¥è¯¢éä»¶è§å¾ï¼å¹¶èªå®ä¹é¾æ¥è¿ææ¶é´ |
| | | |
| | | #### 22. `getStorageAttachmentVOSByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æä¸å¡ç»´åº¦æ¥è¯¢éä»¶è§å¾ |
| | | |
| | | #### 23. `getStorageAttachmentVOSByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId, BigDecimal expired)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æä¸å¡ç»´åº¦æ¥è¯¢éä»¶è§å¾ï¼å¹¶èªå®ä¹é¾æ¥è¿ææ¶é´ |
| | | |
| | | ### 7.7 ä»
è·åé¢è§å°å |
| | | |
| | | #### 24. `getFilePreviewURLByStorageAttachmentIds(List<Long> storageAttachmentIds)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æ ¹æ®éä»¶å
³ç³» id å表ï¼è¿åé¢è§å°åå表 |
| | | |
| | | #### 25. `getFilePreviewURLByStorageAttachmentIds(List<Long> storageAttachmentIds, BigDecimal expired)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æ ¹æ®éä»¶å
³ç³» id å表ï¼è¿å带èªå®ä¹è¿ææ¶é´çé¢è§å°åå表 |
| | | |
| | | #### 26. `getFilePreviewURLByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æä¸å¡ç»´åº¦è¿åé¢è§å°åå表 |
| | | |
| | | #### 27. `getFilePreviewURLByApplicationAndRecordTypeAndRecordIdAndExpired(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId, BigDecimal expired)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æä¸å¡ç»´åº¦è¿å带èªå®ä¹è¿ææ¶é´çé¢è§å°åå表 |
| | | |
| | | ### 7.8 ä»
è·åä¸è½½å°å |
| | | |
| | | #### 28. `getFileDownloadURLByStorageAttachmentIds(List<Long> storageAttachmentIds)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æ ¹æ®éä»¶å
³ç³» id å表ï¼è¿åä¸è½½å°åå表 |
| | | |
| | | #### 29. `getFileDownloadURLByStorageAttachmentIds(List<Long> storageAttachmentIds, BigDecimal expired)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æ ¹æ®éä»¶å
³ç³» id å表ï¼è¿å带èªå®ä¹è¿ææ¶é´çä¸è½½å°åå表 |
| | | |
| | | #### 30. `getFileDownloadURLByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æä¸å¡ç»´åº¦è¿åä¸è½½å°åå表 |
| | | |
| | | #### 31. `getFileDownloadURLByApplicationAndRecordTypeAndRecordIdAndExpired(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId, BigDecimal expired)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æä¸å¡ç»´åº¦è¿å带èªå®ä¹è¿ææ¶é´çä¸è½½å°åå表 |
| | | |
| | | ### 7.9 æå»ºç¾å URL |
| | | |
| | | #### 32. `buildSignedPreviewUrl(StorageBlobVO storageBlob)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - 使ç¨ç³»ç»é»è®¤è¿ææ¶é´ï¼çæé¢è§é¾æ¥ |
| | | |
| | | å®é
è°ç¨ï¼ |
| | | |
| | | - å
é¨çä»·äºè°ç¨ `buildSignedUrl(storageBlob, "/preview/", properties.getExpired())` |
| | | |
| | | #### 33. `buildSignedDownloadUrl(StorageBlobVO storageBlob)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - 使ç¨ç³»ç»é»è®¤è¿ææ¶é´ï¼çæä¸è½½é¾æ¥ |
| | | |
| | | å®é
è°ç¨ï¼ |
| | | |
| | | - å
é¨çä»·äºè°ç¨ `buildSignedUrl(storageBlob, "/download/", properties.getExpired())` |
| | | |
| | | #### 34. `buildSignedUrl(StorageBlobVO storageBlob, String actionPath, BigDecimal expired)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æå»ºç»ä¸ç带ç¾åé¢è§/ä¸è½½å°å |
| | | |
| | | æ¯æï¼ |
| | | |
| | | - `actionPath = "/preview/"` |
| | | - `actionPath = "/download/"` |
| | | |
| | | æ ¸å¿é»è¾ï¼ |
| | | |
| | | 1. æ ¡éªè·¯å¾åæ°åæä»¶ä¿¡æ¯ |
| | | 2. æ¼æ¥åºç¡è®¿é®å°å |
| | | 3. 妿 `expired == -1`ï¼ä¸çæ tokenï¼ç´æ¥èµ° `publicKey` |
| | | 4. å¦åçæå¸¦è¿ææ¶é´ç JWT token |
| | | 5. æ token çä½¿ç¨æ¬¡æ°ä¿¡æ¯åå
¥ Redis |
| | | 6. è¿åæç» URL |
| | | |
| | | éè¦è¯´æï¼ |
| | | |
| | | - `expired` åä½ä¸ºåé |
| | | - é»è®¤è¿ææ¶é´ä¸º 120 åé |
| | | - éæ°¸ä¹
龿¥ä¼åâè¿ææ¶é´ + ä½¿ç¨æ¬¡æ°éå¶âåéæ§å¶ |
| | | |
| | | ### 7.10 token ä½¿ç¨æ§å¶ |
| | | |
| | | #### 35. `cacheTokenUsage(String token, long expiredMillis)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æ token ä½¿ç¨æ¬¡æ°åå§åå° Redis |
| | | |
| | | ç¹ç¹ï¼ |
| | | |
| | | - åå§å¼åå
¥ä¸º `0` |
| | | - TTL ä¸ token è¿ææ¶é´ä¿æä¸è´ |
| | | |
| | | 说æï¼ |
| | | |
| | | - è¿æ¯ç§ææ¹æ³ï¼ä¾ `buildSignedUrl()` å
é¨è°ç¨ |
| | | |
| | | #### 36. `buildTokenUsageKey(String token)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - ç»ä¸çæ Redis key |
| | | |
| | | æ ¼å¼ï¼ |
| | | |
| | | - `file:token:usage:{token}` |
| | | |
| | | 说æï¼ |
| | | |
| | | - è¿æ¯ç§ææ¹æ³ |
| | | |
| | | #### 37. `validateTokenUsage(String token)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - æ ¡éª token æ¯å¦è¿è½ç»§ç»ä½¿ç¨ |
| | | |
| | | æ ¸å¿é»è¾ï¼ |
| | | |
| | | 1. ä» Redis 读åå½åä½¿ç¨æ¬¡æ° |
| | | 2. å¦ææ²¡æå¼ï¼è®¤ä¸ºé¾æ¥å·²è¿ææå·²å¤±æ |
| | | 3. å¦æè¾¾å°ä¸éï¼ç«å³å é¤ Redis è®°å½å¹¶æ¥é |
| | | 4. å¦åèªå¢ä¸æ¬¡ä½¿ç¨æ¬¡æ° |
| | | 5. 妿èªå¢åè¾¾å°ä¸éï¼åå é¤ Redis è®°å½ |
| | | |
| | | 说æï¼ |
| | | |
| | | - è¯¥æ¹æ³é常ä¼å¨å®é
è®¿é®æä»¶æ¶ç±æå¡å±è°ç¨ |
| | | |
| | | #### 38. `resolveLimit()` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - è§£æ token å¯ä½¿ç¨æ¬¡æ°ä¸é |
| | | |
| | | è§åï¼ |
| | | |
| | | - `properties.getUseLimit() <= 0` æ¶ï¼é»è®¤è¿å `10` |
| | | |
| | | 说æï¼ |
| | | |
| | | - è¿æ¯ç§ææ¹æ³ |
| | | |
| | | ### 7.11 è·¯å¾ä¸å缩 |
| | | |
| | | #### 39. `buildRelativePath()` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - çææä»¶åå¨ç¸å¯¹è·¯å¾ |
| | | |
| | | æ ¼å¼ï¼ |
| | | |
| | | - `yyyy/MMdd` |
| | | |
| | | ä¾å¦ï¼ |
| | | |
| | | - `2026/0430` |
| | | |
| | | ç¨éï¼ |
| | | |
| | | - ä¸è¬ç¨äºææ¥æåç®å½ä¿åä¸ä¼ æä»¶ |
| | | |
| | | #### 40. `compressFile(File file)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - 对å¾çè¿è¡å缩ï¼éå¾çæä¸æ»¡è¶³æ¡ä»¶æ¶è¿ååæä»¶ |
| | | |
| | | å缩æ¡ä»¶ï¼ |
| | | |
| | | 1. å¼å¯äº `properties.getCompress()` |
| | | 2. æä»¶æ¯å¾ç |
| | | 3. æä»¶å¤§å°å¤§äº `properties.getNeedCompressSize()` |
| | | |
| | | å¤çé»è¾ï¼ |
| | | |
| | | 1. ç®æ æä»¶å为 `thumb_åæä»¶å` |
| | | 2. 妿å缩æä»¶å·²åå¨ï¼ç´æ¥å¤ç¨ |
| | | 3. ä½¿ç¨ `Thumbnailator` æå尺寸å缩ç»è´¨ |
| | | 4. 妿å缩失败ï¼é级è¿ååæä»¶ |
| | | |
| | | 说æï¼ |
| | | |
| | | - å½åä¸è½½åé¢è§æ¥å£é½ä¼è°ç¨è¿ä¸ªæ¹æ³ |
| | | |
| | | #### 41. `isImage(String fileName)` |
| | | |
| | | ä½ç¨ï¼ |
| | | |
| | | - ç®å夿æä»¶æ¯å¦æ¯å¾ç |
| | | |
| | | æ¯æåç¼ï¼ |
| | | |
| | | - `jpg` |
| | | - `jpeg` |
| | | - `png` |
| | | |
| | | 说æï¼ |
| | | |
| | | - è¿æ¯ç§ææ¹æ³ï¼ä¾ `compressFile()` ä½¿ç¨ |
| | | |
| | | ## 8. æ¨è使ç¨é¡ºåº |
| | | |
| | | ä¸å¡ä¸æå¸¸è§çæ¥å
¥é¡ºåºå¦ä¸ï¼ |
| | | |
| | | 1. å端ä¸ä¼ æä»¶å° `/common/upload` |
| | | 2. æ¿å°è¿åç»æä¸çæä»¶ id |
| | | 3. ä¸å¡ä¿åæ¶è°ç¨ `/storageAttachment/add` |
| | | 4. ä¼ å
¥ `application + recordType + recordId + storageBlobDTOs` |
| | | 5. åç»é¡µé¢åæ¾æ¶æä¸å¡æ¡ä»¶è°ç¨éä»¶æ¥è¯¢ |
| | | 6. å端使ç¨è¿åç `previewURL` æ `downloadURL` |
| | | |
| | | ## 9. å¸¸è§æ³¨æç¹ |
| | | |
| | | ### 9.1 å
ä¸ä¼ ï¼åç»å® |
| | | |
| | | - `/common/upload` åªè´è´£æä»¶å
¥åº |
| | | - `/storageAttachment/add` ææ¯åä¸å¡æ°æ®å»ºç«å
³ç³» |
| | | |
| | | ### 9.2 `application` å¾éè¦ |
| | | |
| | | - å䏿¡ `recordId` ä¸å¯è½æå¤ç»ä¸åç¨ééä»¶ |
| | | - å é¤åæ¥è¯¢æ¶ï¼ç»å¸¸ä¾èµ `application` |
| | | |
| | | ### 9.3 ä¸è½½é¾æ¥ä¸æ¯æ°¸ä¹
ææ |
| | | |
| | | - æ®é龿¥ä¸è¬éè¿ JWT token æ§å¶ |
| | | - åæ¶åè¿ææ¶é´åä½¿ç¨æ¬¡æ°éå¶ |
| | | |
| | | ### 9.4 å
Œ
±æä»¶è¦æ
ç¨ |
| | | |
| | | - `public/upload` ä¸ä¼ çæä»¶å¯èµ°æ°¸ä¹
å
¬å¼è®¿é® |
| | | - éåå
¬å¼èµæºï¼ä¸éåæææä»¶ |
| | | |
| | | ### 9.5 å¾çé¢è§/ä¸è½½å¯è½è¿åå缩æä»¶ |
| | | |
| | | - å½åæ§å¶å¨å¨ä¸è½½åé¢è§åé½ä¼è°ç¨ `compressFile()` |
| | | - 大å¾å¨è®¿é®æ¶å¯è½ä½¿ç¨å缩åç坿¬ |
| | | |
| | | ## 10. ä¸å¥è¯æ»ç» |
| | | |
| | | æ¬é¡¹ç®çæä»¶ä¸ä¼ æ¹æ¡æ¯â䏤鶿®µæ¨¡åâï¼ |
| | | |
| | | - 第ä¸é¶æ®µä¸ä¼ æä»¶ï¼çæ `storage_blob` |
| | | - 第äºé¶æ®µç»å®ä¸å¡ï¼çæ `storage_attachment` |
| | | |
| | | è `FileUtil` åè´è´£æâä¸ä¼ åçæä»¶âåæâ坿¥è¯¢ãå¯é¢è§ãå¯ä¸è½½ãå¯å é¤ã坿§æ¶æâç宿´éä»¶è½åã |