@itshixun/qckeditor-vue2 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -238,6 +238,140 @@ export default {
238
238
  | focus | (event, editor) | 获得焦点 |
239
239
  | input | (data, event, editor) | 内容变化 |
240
240
 
241
+ ## 上传适配器
242
+
243
+ 本库提供了三种上传适配器,用于处理编辑器中的文件上传(图片、音视频等):
244
+
245
+ ### 1. XHR 上传适配器(createXHRUploadAdapter)
246
+
247
+ 基于 XMLHttpRequest 的标准上传方式,适用于大多数后端直传场景:
248
+
249
+ ```js
250
+ import { FileRepository } from 'ckeditor5';
251
+ import { createXHRUploadAdapter } from '@itshixun/qckeditor-vue2';
252
+
253
+ export default {
254
+ data() {
255
+ return {
256
+ content: '',
257
+ editorConfig: {
258
+ // ...其他配置
259
+ extraPlugins: [
260
+ function CustomUploadAdapterPlugin(editor) {
261
+ editor.plugins.get(FileRepository).createUploadAdapter = (loader) => {
262
+ return createXHRUploadAdapter(loader, {
263
+ uploadUrl: 'https://api.example.com/upload',
264
+ headers: { Authorization: 'Bearer token' },
265
+ withCredentials: true,
266
+ fieldName: 'file',
267
+ extraFormData: { category: 'images' },
268
+ });
269
+ };
270
+ },
271
+ ],
272
+ },
273
+ };
274
+ },
275
+ };
276
+ ```
277
+
278
+ ### 2. 自定义异步上传适配器(createAsyncUploadAdapter)
279
+
280
+ 支持自定义异步上传流程,适用于 S3、华为云 OBS 等需要多步上传的场景:
281
+
282
+ ```js
283
+ import { FileRepository } from 'ckeditor5';
284
+ import { createAsyncUploadAdapter } from '@itshixun/qckeditor-vue2';
285
+
286
+ export default {
287
+ data() {
288
+ return {
289
+ content: '',
290
+ editorConfig: {
291
+ extraPlugins: [
292
+ function CustomUploadAdapterPlugin(editor) {
293
+ editor.plugins.get(FileRepository).createUploadAdapter = (loader) => {
294
+ return createAsyncUploadAdapter(loader, async (file, updateProgress) => {
295
+ // 示例:上传到对象存储(预签名 URL 模式)
296
+
297
+ // 第1步:从后端获取预签名上传 URL
298
+ const presignRes = await fetch('/api/presign-upload', {
299
+ method: 'POST',
300
+ headers: { 'Content-Type': 'application/json' },
301
+ body: JSON.stringify({ filename: file.name, contentType: file.type }),
302
+ });
303
+ const { uploadUrl, finalUrl } = await presignRes.json();
304
+
305
+ // 第2步:直传到对象存储(使用 XMLHttpRequest 以便监听进度)
306
+ await new Promise((resolve, reject) => {
307
+ const xhr = new XMLHttpRequest();
308
+ xhr.open('PUT', uploadUrl, true);
309
+ xhr.setRequestHeader('Content-Type', file.type);
310
+
311
+ xhr.upload.addEventListener('progress', (evt) => {
312
+ if (evt.lengthComputable && updateProgress) {
313
+ updateProgress(Math.round((evt.loaded / evt.total) * 100));
314
+ }
315
+ });
316
+ xhr.addEventListener('load', () => {
317
+ xhr.status >= 200 && xhr.status < 300 ? resolve() : reject('上传失败');
318
+ });
319
+ xhr.addEventListener('error', () => reject('上传出错'));
320
+ xhr.send(file);
321
+ });
322
+
323
+ // 第3步:返回最终访问 URL
324
+ return finalUrl;
325
+ });
326
+ };
327
+ },
328
+ ],
329
+ },
330
+ };
331
+ },
332
+ };
333
+ ```
334
+
335
+ 也可以返回 `UploadResponse` 对象:
336
+
337
+ ```js
338
+ createAsyncUploadAdapter(loader, async (file, updateProgress) => {
339
+ // ...上传逻辑
340
+
341
+ return {
342
+ default: 'https://cdn.example.com/image.jpg', // 默认 URL(必须)
343
+ url: 'https://cdn.example.com/image.jpg', // 可选
344
+ // 还可以返回其他字段
345
+ };
346
+ });
347
+ ```
348
+
349
+ ### 3. Mock 上传适配器(createMockUploadAdapter)
350
+
351
+ 用于演示环境,模拟上传过程和进度更新:
352
+
353
+ ```js
354
+ import { FileRepository } from 'ckeditor5';
355
+ import { createMockUploadAdapter } from '@itshixun/qckeditor-vue2';
356
+
357
+ export default {
358
+ data() {
359
+ return {
360
+ content: '',
361
+ editorConfig: {
362
+ extraPlugins: [
363
+ function CustomUploadAdapterPlugin(editor) {
364
+ editor.plugins.get(FileRepository).createUploadAdapter = (loader) => {
365
+ return createMockUploadAdapter(loader);
366
+ };
367
+ },
368
+ ],
369
+ },
370
+ };
371
+ },
372
+ };
373
+ ```
374
+
241
375
  ## 与 Vue 3 版本的区别
242
376
 
243
377
  1. **组件注册**:Vue 2 需要手动在 `components` 选项中注册