Im use iwbootstrap4 + Bootstrap File Input library for upload files:
Code:
procedure TFrameProductPicture.IWBS4File1CustomRestEvents0RestEvent(
aApplication: TIWApplication; aRequest: THttpRequest; aReply: THttpReply;
aParams: TStrings);
var
FileUpload: THttpFile;
begin
if aRequest.Files.Count > 0 then
begin
FileUpload := THttpFile( aRequest.Files[ aRequest.Files.Count - 1 ] );
FPictureFile := IWServerController.ContentPath +
UPLOAD_FOLDER + '\' +
TPath.GetGUIDFileName.ToLower +
ExtractFileExt( FileUpload.FileName );
FileUpload.SaveToFile( FPictureFile );
end;
aReply.WriteString('{"id": "1"}');
end;
Most JPG files load normally, but some JPG files, as well as ALL PNG files get corrupted after loading (only part of the image is loaded), here is an example of files BEFORE and AFTER uploading to the server. What could be the reason ?
IW version: 15.1.19
[
attachment=225]
[
attachment=226]
I found out that the data of the input file and the file stored on the server differ by one byte at approximately the same address, then the file structure is saved.
I have attached examples of comparison of three files downloaded not by the server, on top is the original file, on the bottom is the file after loading. I circled the places of difference in red (one byte is always lost in the saved file).
I still have not figured out what is causing this.
[
attachment=228]
[
attachment=229]
[
attachment=230]
Hi,
I have the same problem with IW v15.1.20
I can't upload multiple files. Only a few files are uploaded.
But I do this:
If I set IWBS4File1 > CustomRestEvents > uploadUrl > ParseFileUpload to False
All files will be uploaded, but I have to manually parse files.
I noticed that in StandAlone Server mode everything works fine, the problem only occurs in HTTPSys mode.
(04-19-2020, 09:21 PM)TPiotr Wrote: [ -> ]Hi,
I have the same problem with IW v15.1.20
I can't upload multiple files. Only a few files are uploaded.
But I do this:
If I set IWBS4File1 > CustomRestEvents > uploadUrl > ParseFileUpload to False
All files will be uploaded, but I have to manually parse files.
How you get a PostStream for parsing ? My aRequest: THttpRequest don`t have PostStream parametr.
Code:
procedure TAppUpload.IWBS4File1CustomRestEvents0RestEvent(
aApplication: TIWApplication; aRequest: THttpRequest; aReply: THttpReply;
aParams: TStrings);
var i: integer; AStream: TMemoryStream;
begin
for i := 0 to aRequest.Files.Count-1 do
begin
// THttpFile(aRequest.Files[i]).SaveToFile(ExtractFilePath(ParamStr(0))+'Data\'+aRequest.Files[i].FileName, True);
AStream := TMemoryStream.Create;
try
THttpFile(aRequest.Files[i]).SaveToStream(AStream);
AStream.Position := 0;
AStream.SaveToFile(ExtractFilePath(ParamStr(0))+'Data\'+aRequest.Files[i].FileName); // Correct FileName can only be read manually from the stream
(...)
finally
AStream.Free;
end;
end;
aReply.WriteString('{"id": "1"}');
end;
You get all files when you set IWBS4File1 > CustomRestEvents > uploadUrl > ParseFileUpload to False
Stream looks like this:
------WebKitFormBoundaryQm9CpCSSrHXo0r3p
Content-Disposition: form-data; name="IWBS4FILE1[]"; filename="TestFile.png"
Content-Type: image/png
‰PNG
(...)
------WebKitFormBoundaryQm9CpCSSrHXo0r3p
Content-Disposition: form-data; name="file_id"
2
------WebKitFormBoundaryQm9CpCSSrHXo0r3p--
I know what the stream looks like, but I don't know how to get it:
If I set ParseFileUpload to False, then the aRequest.Files.Count will always be 0.
I always have aRequest.Files.Count := 1
CustomRestEvents0RestEvent executes every uploaded file.
My code from DFM:
Code:
object IWBS4File1: TIWBS4File
Left = 331
Top = 144
Width = 161
Height = 33
CustomAsyncEvents = <
item
EventName = 'fileuploaded'
OnAsyncEvent = IWBS4File1CustomAsyncEvents0AsyncEvent
end>
CustomRestEvents = <
item
EventName = 'uploadUrl'
OnRestEvent = IWBS4File1CustomRestEvents0RestEvent
ParseFileUpload = False
end>
Script.Strings = (
'$("#{%htmlname%}").fileinput({uploadUrl: "{%uploadUrl%}", langua' +
'ge: "pl", maxFileSize: 2097152000, showRemove: false, showPrevie' +
'w: false, allowedPreviewTypes: null});'
'$("#{%htmlname%}").off("fileuploaded").on("fileuploaded", functi' +
'on() {{%fileuploaded%}});')
Multiple = True
end
(04-20-2020, 10:58 AM)TPiotr Wrote: [ -> ]I always have aRequest.Files.Count := 1
CustomRestEvents0RestEvent executes every uploaded file.
My code from DFM:
Code:
object IWBS4File1: TIWBS4File
Left = 331
Top = 144
Width = 161
Height = 33
CustomAsyncEvents = <
item
EventName = 'fileuploaded'
OnAsyncEvent = IWBS4File1CustomAsyncEvents0AsyncEvent
end>
CustomRestEvents = <
item
EventName = 'uploadUrl'
OnRestEvent = IWBS4File1CustomRestEvents0RestEvent
ParseFileUpload = False
end>
Script.Strings = (
'$("#{%htmlname%}").fileinput({uploadUrl: "{%uploadUrl%}", langua' +
'ge: "pl", maxFileSize: 2097152000, showRemove: false, showPrevie' +
'w: false, allowedPreviewTypes: null});'
'$("#{%htmlname%}").off("fileuploaded").on("fileuploaded", functi' +
'on() {{%fileuploaded%}});')
Multiple = True
end
Which apptype are you using SA (IWStart) or HTTPSys(IWStartHSys) ?