Конференция "Сети" » Передача файла Indy
 
  • ggg (07.01.08 09:32) [0]
    В программе появилась необходимость загружать несколько файлов на сервер, предварительно изменив их размер. Усугубляется дело тем, что происходить это должно в отдельном потоке, поэтому и не хочется лишний раз создавать временные файлы и, возможно, из-за этого сейчас и возникают проблемы.


    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
               //
               // Собственно вот здесь происходит изменение размеров изображения из файла fn с сохранением результата в файл fn_tmp
               //
               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, да и просто не красиво. Может быть есть более красивое решение?
 
Конференция "Сети" » Передача файла Indy
Есть новые Нет новых   [134431   +15][b:0][p:0.002]