@@ -21,6 +21,7 @@ import Search from "./search";
21
21
import 'bytemd/dist/index.css' ;
22
22
import 'juejin-markdown-themes/dist/juejin.css' ;
23
23
import "./index.scss" ;
24
+ import { set } from "lodash" ;
24
25
25
26
const plugins = [
26
27
gfm ( {
@@ -35,6 +36,13 @@ interface TagValue {
35
36
tag : string ;
36
37
}
37
38
39
+ interface ImageInfo {
40
+ img : string ;
41
+ alt : string ;
42
+ src : string ;
43
+ index : number ; // 图片在文本中的位置
44
+ }
45
+
38
46
export interface IFormType {
39
47
articleId : number ; // 文章id
40
48
status : number ; // 文章状态
@@ -140,61 +148,73 @@ const ArticleEdit: FC<IProps> = props => {
140
148
}
141
149
142
150
// 如果是外网的图片链接,转成内网的图片链接
143
- const handleReplaceImgUrl = async ( ) => {
144
- const { content } = form ;
145
- // 临时变量 content
146
- let contentTemp ;
147
- console . log ( "content vs lastContent" , content , lastContent ) ;
151
+ const uploadImages = async ( newVal : string ) => {
152
+ let add ;
148
153
// 如果新的内容以上次转链后的内容开头
149
- if ( content . startsWith ( lastContent ) ) {
154
+ if ( newVal . startsWith ( lastContent ) ) {
150
155
// 变化的内容
151
- contentTemp = content . substring ( lastContent . length ) ;
152
- } else if ( lastContent . startsWith ( content ) ) {
156
+ add = newVal . substring ( lastContent . length ) ;
157
+ } else if ( lastContent . startsWith ( newVal ) ) {
153
158
// 删掉了一部分内容
154
- setLastContent ( content ) ;
159
+ setLastContent ( newVal ) ;
155
160
console . log ( "删掉了一部分内容" , lastContent ) ;
156
161
return ;
157
162
} else {
158
- contentTemp = content ;
163
+ add = newVal ;
159
164
}
160
165
161
166
// 正则表达式
162
167
const reg = / ! \[ ( .* ?) \] \( ( .* ?) \) / mg;
163
168
let match ;
164
169
165
- while ( ( match = reg . exec ( contentTemp ) ) !== null ) {
170
+ let uploadTasks = [ ] ;
171
+ let imageInfos :ImageInfo [ ] = [ ] ; // 用于存储图片信息和它们在文本中的位置
172
+
173
+ while ( ( match = reg . exec ( add ) ) !== null ) {
166
174
const [ img , alt , src ] = match ;
167
175
console . log ( "img, alt, src" , match , img , alt , src ) ;
168
176
// 如果是外网的图片链接,转成内网的图片链接
169
- if ( src . length > 0 && src . startsWith ( "http" ) && src . indexOf ( "saveError" ) < 0 ) {
177
+ if ( src . length > 0 && src . startsWith ( "http" )
178
+ && src . indexOf ( "saveError" ) < 0 ) {
179
+ // 收集图片信息
180
+ imageInfos . push ( { img, alt, src, index : match . index } ) ;
170
181
// 判断图片的链接是否已经上传过了
171
182
if ( ! canUpload ( src ) ) {
172
183
console . log ( "30秒内防重复提交,忽略:" , src ) ;
173
184
continue ;
185
+ } else {
186
+ uploadTasks . push ( saveImgApi ( src ) ) ;
174
187
}
188
+ }
189
+ }
190
+
191
+ // 同时上传所有图片
192
+ const results = await Promise . all ( uploadTasks ) ;
175
193
176
- // 调用上传图片的接口
177
- const { status : resultStatus , result } = await saveImgApi ( src ) ;
178
- const { code } = resultStatus || { } ;
179
- if ( code === 0 ) {
194
+ // 替换所有图片链接
195
+ let newContent = newVal ;
196
+ results . forEach ( ( result , i ) => {
197
+ if ( result . status && result . status . code === 0 && result . result ) {
180
198
// 重新组织图片的路径
181
- let newSrc = `` ;
199
+ const newSrc = `![${ imageInfos [ i ] . alt } ](${ result . result . imagePath } )` ;
182
200
console . log ( "newSrc" , newSrc ) ;
183
201
// 替换后的内容
184
- let newContent = content . replace ( img , newSrc ) ;
202
+ newContent = newContent . replace ( imageInfos [ i ] . img , newSrc ) ;
185
203
console . log ( "newContent" , newContent ) ;
186
-
187
- // 替换图片链接
188
- setContent ( newContent ) ;
189
- handleChange ( { content : newContent } ) ;
190
- setLastContent ( newContent ) ;
191
- } else {
192
- message . error ( "转链失败" ) ;
193
204
}
194
- }
195
- }
205
+ } ) ;
206
+ setLastContent ( newVal ) ;
196
207
197
- message . success ( "转链完成,可以看看控制台的输出" ) ;
208
+ return newContent ;
209
+ }
210
+
211
+ const handleReplaceImgUrl = async ( ) => {
212
+ const { content } = form ;
213
+ const newContent = await uploadImages ( content ) ;
214
+ if ( newContent ) {
215
+ setContent ( newContent ) ;
216
+ handleChange ( { content : newContent } ) ;
217
+ }
198
218
}
199
219
200
220
// 编辑或者新增时提交数据到服务器端
0 commit comments