В программе появилась необходимость загружать несколько файлов на сервер, предварительно изменив их размер. Усугубляется дело тем, что происходить это должно в отдельном потоке, поэтому и не хочется лишний раз создавать временные файлы и, возможно, из-за этого сейчас и возникают проблемы.
function kctSendCarPhotos(const cmd: Integer; const AParams: array of string;
const ACarLocalID: string; var AResult: string): Boolean;
var
i, n: Integer;
PostData: string;
http: TIdHTTP;
data: TIdMultiPartFormDataStream;
q: TDataSet;
fn_prefix, CarID, fn, fn_tmp: string;
phID: Int64;
sessUSC_calc: string;
begin
...
try
http := TIdHTTP.Create(Application);
data := TIdMultiPartFormDataStream.Create;
PostData := code7(PostData);
PostData := base64_encode(PostData);
data.AddFormField('Data', PostData);
CarID := ExtractLocalCarID(ACarLocalID);
q := Query_cl(
'SELECT PhotoID FROM CarPhoto ' +
' WHERE CarID=' + addslashes2(CarID) + ' ORDER BY PhotoID'
);
q.First;
fn_prefix := iclnt.DirPhoto + '\' + CarID + '_';
n := 0;
while (not q.Eof) and (n < 4) do
try
phID := VarToInt(q.Fields[0].Value);
fn := fn_prefix + IntToStr(phID) + '.jpg';
if FileExists(fn) then
begin
fn_tmp := fn_prefix + IntToStr(phID) + '_s.jpg';
try
if not gSmoothResizeImageFile(fn, fn_tmp, 640, 480) then
fn_tmp := '';
except
fn_tmp := '';
end;
if fn_tmp <> '' then
data.AddFile(
'Photo' + IntToStr(n + 1), fn_tmp,
GetMIMETypeFromFile(fn_tmp)
);
Inc(n);
end;
finally
q.Next;
end;
q.Free;
try
http.Request.ContentType := data.RequestContentType;
AResult := http.Post(iPublicData.TunnelScriptURL, data);
Result := true;
except
Result := false;
AResult := 'Не удалось получить данные от сервера.';
end;
data.Free;
http.Disconnect;
http.Free;
except
Result := false;
AResult := 'Неизвестная ошибка.';
end;
end;
Проблема в том, что у TIdMultiPartFormDataStream нет метода AddFileStream. Хотелось бы не сохранять отмасштабированное изображение на диске, а сразу передавать его в data по средствам TMemoryStream.
Пока выходом вижу считать TMemoryStream в строку и сделать
data.AddField('PhotoFile1', ImageAsString);
Но тогда на сервере эти данные будут в переменной $_POST, а не $_FILE, да и просто не красиво. Может быть есть более красивое решение?