|
1 | | -using BotSharp.Abstraction.Browsing; |
2 | | -using BotSharp.Abstraction.Browsing.Models; |
| 1 | +using BotSharp.Abstraction.Files.Converters; |
| 2 | +using BotSharp.Core.Files.Converters; |
3 | 3 | using Microsoft.EntityFrameworkCore; |
4 | 4 | using System.IO; |
5 | 5 | using System.Linq; |
@@ -51,18 +51,8 @@ private async Task<List<MessageFileModel>> GetMessageFiles(string conversationId |
51 | 51 |
|
52 | 52 | try |
53 | 53 | { |
54 | | - var msgInfo = new MessageInfo |
55 | | - { |
56 | | - ContextId = Guid.NewGuid().ToString() |
57 | | - }; |
58 | | - var web = _services.GetRequiredService<IWebBrowser>(); |
59 | 54 | var preFixPath = Path.Combine(_baseDir, CONVERSATION_FOLDER, conversationId, FILE_FOLDER); |
60 | 55 |
|
61 | | - if (isNeedScreenShot) |
62 | | - { |
63 | | - await web.LaunchBrowser(msgInfo); |
64 | | - } |
65 | | - |
66 | 56 | foreach (var messageId in messageIds) |
67 | 57 | { |
68 | 58 | var dir = Path.Combine(preFixPath, messageId, source); |
@@ -91,40 +81,40 @@ private async Task<List<MessageFileModel>> GetMessageFiles(string conversationId |
91 | 81 | var screenShotDir = Path.Combine(subDir, SCREENSHOT_FILE_FOLDER); |
92 | 82 | if (ExistDirectory(screenShotDir) && Directory.GetFiles(screenShotDir).Any()) |
93 | 83 | { |
94 | | - file = Directory.GetFiles(screenShotDir).First(); |
95 | | - contentType = GetFileContentType(file); |
96 | | - |
97 | | - var model = new MessageFileModel() |
| 84 | + foreach (var screenShot in Directory.GetFiles(screenShotDir)) |
98 | 85 | { |
99 | | - MessageId = messageId, |
100 | | - FileStorageUrl = file, |
101 | | - ContentType = contentType |
102 | | - }; |
103 | | - files.Add(model); |
| 86 | + contentType = GetFileContentType(screenShot); |
| 87 | + if (!_allowedImageTypes.Contains(contentType)) continue; |
| 88 | + |
| 89 | + var model = new MessageFileModel() |
| 90 | + { |
| 91 | + MessageId = messageId, |
| 92 | + FileStorageUrl = screenShot, |
| 93 | + ContentType = contentType |
| 94 | + }; |
| 95 | + files.Add(model); |
| 96 | + } |
104 | 97 | } |
105 | 98 | else |
106 | 99 | { |
107 | | - await web.GoToPage(msgInfo, new PageActionArgs { Url = file }); |
108 | | - var path = Path.Combine(subDir, SCREENSHOT_FILE_FOLDER, $"{Guid.NewGuid()}.png"); |
109 | | - await web.ScreenshotAsync(msgInfo, path); |
110 | | - contentType = GetFileContentType(path); |
| 100 | + var screenShotPath = Path.Combine(subDir, SCREENSHOT_FILE_FOLDER); |
| 101 | + var images = await ConvertPdfToImages(file, screenShotPath); |
111 | 102 |
|
112 | | - var model = new MessageFileModel() |
| 103 | + foreach (var image in images) |
113 | 104 | { |
114 | | - MessageId = messageId, |
115 | | - FileStorageUrl = path, |
116 | | - ContentType = contentType |
117 | | - }; |
118 | | - files.Add(model); |
| 105 | + contentType = GetFileContentType(image); |
| 106 | + var model = new MessageFileModel() |
| 107 | + { |
| 108 | + MessageId = messageId, |
| 109 | + FileStorageUrl = image, |
| 110 | + ContentType = contentType |
| 111 | + }; |
| 112 | + files.Add(model); |
| 113 | + } |
119 | 114 | } |
120 | 115 | } |
121 | 116 | } |
122 | 117 | } |
123 | | - |
124 | | - if (isNeedScreenShot) |
125 | | - { |
126 | | - await web.CloseBrowser(msgInfo.ContextId); |
127 | | - } |
128 | 118 | } |
129 | 119 | catch (Exception ex) |
130 | 120 | { |
@@ -227,9 +217,13 @@ public bool SaveMessageFiles(string conversationId, string messageId, string sou |
227 | 217 | Directory.CreateDirectory(subDir); |
228 | 218 | } |
229 | 219 |
|
230 | | - using var fs = new FileStream(Path.Combine(subDir, file.FileName), FileMode.Create); |
231 | | - fs.Write(bytes, 0, bytes.Length); |
232 | | - fs.Flush(true); |
| 220 | + using (var fs = new FileStream(Path.Combine(subDir, file.FileName), FileMode.Create)) |
| 221 | + { |
| 222 | + fs.Write(bytes, 0, bytes.Length); |
| 223 | + fs.Flush(true); |
| 224 | + fs.Close(); |
| 225 | + Thread.Sleep(100); |
| 226 | + } |
233 | 227 | } |
234 | 228 |
|
235 | 229 | return true; |
@@ -318,5 +312,20 @@ private string GetConversationFileDirectory(string? conversationId, string? mess |
318 | 312 | var dir = Path.Combine(_baseDir, CONVERSATION_FOLDER, conversationId); |
319 | 313 | return dir; |
320 | 314 | } |
| 315 | + |
| 316 | + private async Task<IEnumerable<string>> ConvertPdfToImages(string pdfLoc, string imageLoc) |
| 317 | + { |
| 318 | + var converters = _services.GetServices<IPdf2ImageConverter>(); |
| 319 | + if (converters.IsNullOrEmpty()) return Enumerable.Empty<string>(); |
| 320 | + |
| 321 | + var converter = converters.FirstOrDefault(x => x.GetType().Name != typeof(PdfiumConverter).Name); |
| 322 | + if (converter == null) |
| 323 | + { |
| 324 | + converter = converters.FirstOrDefault(x => x.GetType().Name == typeof(PdfiumConverter).Name); |
| 325 | + if (converter == null) return Enumerable.Empty<string>(); |
| 326 | + } |
| 327 | + |
| 328 | + return await converter.ConvertPdfToImages(pdfLoc, imageLoc); |
| 329 | + } |
321 | 330 | #endregion |
322 | 331 | } |
0 commit comments