私の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;