5

私のHTTPサーバーでは、ユーザーがこのフォームで画像をアップロードできるようにしようとしています:

<form action="/?command=saveImage" method="post" enctype="multipart/form-data">
  <input type="file" name="images" multiple="multiple"/>
  <input type="submit">
</form>

このソースを使用して画像をアップロードしています: http://embarcadero.newsgroups.archived.at/public.delphi.internet.winsock/201107/1107276163.htmlそして、画像を正しい形式で保存するために ProcessMimePart 手順を変更しました:

procedure ProcessMimePart(var aDecoder: TIdMessageDecoder;
  var aMsgEnd: Boolean);
var
  LMStream: TMemoryStream;
  LNewDecoder: TIdMessageDecoder;
  fileName, fileExtension: string;
begin
  fileName := aDecoder.fileName;
  fileExtension := GetFileExtension(fileName);

  if (fileExtension <> 'jpg') and (fileExtension <> 'png') 
    and (fileExtension <> 'bmp') then
  begin
    Exit;
  end;

  LMStream := TMemoryStream.Create;
  try
    LNewDecoder := aDecoder.ReadBody(LMStream, aMsgEnd);
    try
      LMStream.Position := 0;
      TSaveImageController.WriteImage(fileName, fileExtension, LMStream);
    except
      LNewDecoder.Free;
      raise;
    end;
    aDecoder.Free;
    aDecoder := LNewDecoder;
  finally
    FreeAndNil(LMStream);
  end;
end;

このコードは、1 つのファイルをアップロードすると正常に動作しますが、さらに画像をアップロードしようとすると、最初の画像を保存すると、「モジュール 'App.exe' のアドレス 004BAD86 でアクセス違反が発生しました。アドレス 00000000' の読み取り

編集:

function GetFileExtension(aFileName: string): string;
var
  isValidImageFileExtension: Boolean;
  lastIndexOfComa: integer;
  fileExtension: string;
begin
  lastIndexOfComa := aFileName.LastIndexOf('.');
  if lastIndexOfComa <= 0 then
  begin
    Result := '';
  end
  else
  begin
    fileExtension := LowerCase(aFileName.Substring(lastIndexOfComa + 1));
    if (fileExtension = 'jpg') or (fileExtension = 'bmp') or
      (fileExtension = 'png') then
    begin
      Result := fileExtension;
      Exit;
    end
    else
    begin
      Result := '';
    end;
  end;
end;
4

0 に答える 0