我有一个程序,它充当web服务器和用户之间的接口,允许用户将文件上传到web服务器。当用户单击"Upload“时,它会从列表视图中获取信息并将其发送到网站,第一个http.Post用于实际文件,第二个用于我存储的有关该文件的元数据。
当我注释掉第一个Post语句时,它工作得很好,实际上发布了数据,但当它们都在那里时,它似乎没有获得第二个语句的任何参数。当我在web浏览器中使用Param中的值运行脚本时,它也会起作用。
UFile是包含文件元数据的记录。
IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create;
http := TIdHTTP.Create(nil);
http.IOHandler := IOHandler;
Param := TStringList.Create;
DataParams := TIdMultiPartFormDataStream.Create;
Stream := TStringStream.Create('');
DebugStream := TStringStream.Create('');
Param.Add('serial='+UFile.Serial);
Param.Add('filename='+UFile.Name);
Param.Add('filepath='+'\'+UFile.Serial+'\'+IntToStr(UFile.PatchID));
Param.Add('patchid='+IntToStr(UFile.PatchID));
Param.Add('patchnotes='+UFile.PatchNotes);
Param.Add('earliestversion='+UFile.EarliestVersion);
Param.Add('latestversion='+UFile.LatestVersion);
Param.Add('date='+DateToStr(UFile.Date));
Param.Add('execaftersend='+BoolToStr(UFile.ExecAfterSend));
DataParams.AddFile('file', UFile.FilePath, 'application/octet-stream');
try
http.Post('http://example.com/postFile.php', DataParams, Stream);
ShowMessage(Stream.DataString);
http.Post('http://example.com/uploadFiles.php', Param, DebugStream);
ShowMessage(DebugStream.DataString);
for J := 0 to Pred(Param.Count) do
DebugStrings := DebugStrings + '&' + Param.Strings[J];
ShowMessage(DebugStrings);
except
on E: EIdHTTPProtocolException do
begin
ShowMessage('Error code:' + IntToStr(E.ErrorCode));
end
end;发布于 2013-06-24 22:15:41
虽然这并不能真正解决做两篇文章的问题,但它确实允许你上传包含其他数据的文件,这就是为什么我一开始做两篇文章的原因。
使用TIdMultiPartFormDataStream并添加您的文件AddFile,然后使用AddFormField添加任何其他数据。
示例:
DataParams.AddFile('file', UFile.FilePath, 'application/octet-stream');
DataParams.AddFormField('serial', UFile.Serial);
DataParams.AddFormField('filename', UFile.Name);https://stackoverflow.com/questions/17241795
复制相似问题