22using Lagrange . Core . Internal . Packets . Service ;
33using Lagrange . Core . Utility ;
44using Lagrange . Core . Utility . Cryptography ;
5+ using Lagrange . Core . Utility . Extension ;
56
67namespace Lagrange . Core . Internal . Context ;
78
@@ -23,59 +24,45 @@ internal FlashTransferContext(BotContext botContext)
2324
2425 public async Task < bool > UploadFile ( string uKey , Stream bodyStream )
2526 {
26- byte [ ] body ;
27- if ( bodyStream is MemoryStream ms )
28- {
29- body = ms . ToArray ( ) ;
30- }
31- else
32- {
33- bodyStream . Position = 0 ;
34- var buffer = new byte [ bodyStream . Length ] ;
35- await bodyStream . ReadExactlyAsync ( buffer , 0 , buffer . Length ) ;
36- body = buffer ;
37- }
38-
39- return await UploadFile ( uKey , body ) ;
40- }
41-
42- public async Task < bool > UploadFile ( string uKey , byte [ ] body )
43- {
44- var chunkSha1S = new FlashTransferSha1StateV { State = [ ] } ;
45- var chunkBuffers = new List < byte [ ] > ( ) ;
46- var chunkCount = ( uint ) ( ( body . Length + ChunkSize - 1 ) / ChunkSize ) ;
27+ var sha1StateVs = new FlashTransferSha1StateV { State = [ ] } ;
28+ var chunkCount = ( uint ) ( ( bodyStream . Length + ChunkSize - 1 ) / ChunkSize ) ;
4729
48- using var accStream = new MemoryStream ( ) ;
30+ var sha1Stream = new Sha1Stream ( ) ;
4931 for ( uint i = 0 ; i < chunkCount ; i ++ )
5032 {
51- var chunkBuffer = body . AsSpan ( ( int ) ( i * ChunkSize ) , ( int ) Math . Min ( ChunkSize , body . Length - i * ChunkSize ) )
52- . ToArray ( ) ;
53- chunkBuffers . Add ( chunkBuffer ) ;
54-
5533 if ( i != chunkCount - 1 )
5634 {
57- accStream . Write ( chunkBuffer , 0 , chunkBuffer . Length ) ;
58- var accBytes = accStream . ToArray ( ) ;
59- var sha1Stream = new Sha1Stream ( ) ;
35+ var accLength = ( int ) ( ( i + 1 ) * ChunkSize ) ;
36+ var accBuffer = new byte [ accLength ] ;
37+
38+ bodyStream . Position = 0 ;
39+ await bodyStream . ReadExactlyAsync ( accBuffer , 0 , accLength ) ;
40+
41+ var accSpan = accBuffer . AsSpan ( ) ;
6042 var digest = new byte [ 20 ] ;
61- sha1Stream . Update ( accBytes ) ;
43+ sha1Stream . Update ( accSpan ) ;
6244 sha1Stream . Hash ( digest , false ) ;
63- chunkSha1S . State . Add ( digest ) ;
45+ sha1Stream . Reset ( ) ;
46+ sha1StateVs . State . Add ( digest . ToArray ( ) ) ;
6447 }
6548 else
6649 {
67- chunkSha1S . State . Add ( SHA1 . HashData ( body ) ) ;
50+ bodyStream . Position = 0 ;
51+ sha1StateVs . State . Add ( bodyStream . Sha1 ( ) ) ;
6852 }
6953 }
7054
71- // cnm闹禅tx为什么不能并发,回答我
72- foreach ( var chunkBuffer in chunkBuffers )
55+ for ( uint i = 0 ; i < chunkCount ; i ++ )
7356 {
74- var success = await UploadChunk ( uKey , ( uint ) ( chunkBuffers . IndexOf ( chunkBuffer ) * ChunkSize ) , chunkSha1S , chunkBuffer ) ;
75- if ( ! success )
76- {
77- return false ;
78- }
57+ var chunkStart = ( long ) ( i * ChunkSize ) ;
58+ var chunkLength = ( int ) Math . Min ( ChunkSize , bodyStream . Length - chunkStart ) ;
59+
60+ bodyStream . Position = chunkStart ;
61+ var uploadBuffer = new byte [ chunkLength ] ;
62+ await bodyStream . ReadExactlyAsync ( uploadBuffer , 0 , chunkLength ) ;
63+
64+ var success = await UploadChunk ( uKey , ( uint ) chunkStart , sha1StateVs , uploadBuffer ) ;
65+ if ( ! success ) return false ;
7966 }
8067
8168 return true ;
0 commit comments