标签:10 13 end data bound mormot Content multipart 上传
mormot multipart上传文件
首先修改mormot的MultiPartFormDataEncode()
function MultiPartFormDataEncode(const MultiPart: TMultiPartDynArray; var MultiPartContentType, MultiPartContent: RawUTF8): boolean; var len, boundcount, filescount, i: integer; boundaries: array of RawUTF8; bound: RawUTF8; W: TTextWriter; temp: TTextWriterStackBuffer; procedure NewBound; var random: array[1..3] of cardinal; begin FillRandom(@random,3); bound := BinToBase64(@random,SizeOf(Random)); SetLength(boundaries,boundcount+1); boundaries[boundcount] := bound; inc(boundcount); end; begin result := false; len := length(MultiPart); if len=0 then exit; boundcount := 0; filescount := 0; W := TTextWriter.CreateOwnedStream(temp); try // header - see https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html NewBound; //MultiPartContentType := 'Content-Type: multipart/form-data; boundary='+bound; MultiPartContentType := 'multipart/form-data; boundary='+bound; for i := 0 to len-1 do with MultiPart[i] do begin if FileName='' then W.Add('--%'#13#10'Content-Disposition: form-data; name="%"'#13#10+ 'Content-Type: %'#13#10#13#10'%'#10'--%'#13#10, [bound,Name,ContentType,Content,bound]) else begin // if this is the first file, create the header for files if filescount=0 then begin if i>0 then NewBound; W.Add('Content-Disposition: form-data; name="files"'#13#10+ 'Content-Type: multipart/mixed; boundary=%'#13#10#13#10,[bound]); end; inc(filescount); W.Add('--%'#13#10'Content-Disposition: form-data; name="%" filename="%"'#13#10+ 'Content-Type: %'#13#10,[bound, Name, FileName,MultiPartContentType]); // W.Add('--%'#13#10'Content-Disposition: file; filename="%"'#13#10+ // 'Content-Type: %'#13#10,[bound,FileName,ContentType]); if Encoding<>'' then W.Add('Content-Transfer-Encoding: %'#13#10,[Encoding]); W.AddCR; W.AddString(MultiPart[i].Content); W.Add(#13#10'--%'#13#10,[bound]); end; end; // footer multipart for i := boundcount-1 downto 0 do W.Add('--%--'#13#10, [boundaries[i]]); W.SetText(MultiPartContent); result := True; finally W.Free; end; end;
var part: SynCommons.TMultiPart; parts: SynCommons.TMultiPartDynArray; sFile, fileName : string; fs: Tfilestream; rs: TRawByteStringStream; data, ContentType : RawUTF8; begin //打开文件 if not OpenDialog1.Execute then Exit; sFile := OpenDialog1.FileName; fileName := AnsiToUtf8(ExtractFileName(sFile)); try fs := Tfilestream.Create(sFile, fmOpenRead); rs := TRawByteStringStream.Create; rs.CopyFrom(fs, fs.Size); SetLength(parts, 1); part.ContentType := 'multipart/form-data;boundary='; part.Name := 'xssjdb'; part.FileName := fileName;//文件名,上传至服务端的文件名,一般是原文件名,可以是别名 part.Content := rs.DataString; //文件内容 parts[0] := part; //添加参数, 服务端以request的query参数接收。与普通参数一样 syncommons.MultiPartFormDataAddField('filename', fileName, parts); SynCommons.MultiPartFormDataEncode(parts, ContentType, data); finally rs.Free; fs.Free; end; if http.Post('访问的地址url', data, ContentType) = 200 then begin //Memo1.Lines.Add(Utf8ToAnsi(http.Content)); end; end;
标签:10,13,end,data,bound,mormot,Content,multipart,上传 来源: https://www.cnblogs.com/hnxxcxg/p/15009171.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。