Skip to content

Commit a425ee9

Browse files
Experimental file upload element
1 parent 3300393 commit a425ee9

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package ng.appserver.elements;
2+
3+
import java.io.IOException;
4+
import java.util.List;
5+
import java.util.Map;
6+
7+
import ng.appserver.NGContext;
8+
import ng.appserver.NGRequest;
9+
import ng.appserver.NGRequest.UploadedFile;
10+
import ng.appserver.NGResponse;
11+
import ng.appserver.templating.NGDynamicElement;
12+
import ng.appserver.templating.NGElement;
13+
import ng.appserver.templating.assications.NGAssociation;
14+
15+
public class NGFileUpload extends NGDynamicElement {
16+
17+
private final NGAssociation _filenameAssociation;
18+
private final NGAssociation _dataAssociation;
19+
private final NGAssociation _nameAssociation;
20+
21+
public NGFileUpload( final String name, final Map<String, NGAssociation> associations, final NGElement contentTemplate ) {
22+
super( null, null, null );
23+
_filenameAssociation = associations.get( "filename" );
24+
_dataAssociation = associations.get( "data" );
25+
_nameAssociation = associations.get( "name" );
26+
}
27+
28+
@Override
29+
public void appendToResponse( final NGResponse response, final NGContext context ) {
30+
response.appendContentString( """
31+
<input type="file" name="%s" />
32+
""".formatted( name( context ) ) );
33+
}
34+
35+
/**
36+
* @return The name of the field (to use in the HTML code)
37+
*/
38+
private String name( final NGContext context ) {
39+
40+
if( _nameAssociation != null ) {
41+
return (String)_nameAssociation.valueInComponent( context.component() );
42+
}
43+
44+
return context.elementID().toString();
45+
}
46+
47+
@Override
48+
public void takeValuesFromRequest( NGRequest request, NGContext context ) {
49+
final String name = name( context );
50+
final List<String> valuesFromRequest = request.formValuesForKey( name );
51+
52+
if( !valuesFromRequest.isEmpty() ) {
53+
54+
// If multiple form values are present for the same field name, the potential for an error condition is probably high enough to just go ahead and fail.
55+
if( valuesFromRequest.size() > 1 ) {
56+
throw new IllegalStateException( "The request contains %s form values named '%s'. I can only handle one at a time. The values you sent me are (%s).".formatted( valuesFromRequest.size(), name, valuesFromRequest ) );
57+
}
58+
59+
// If we have a value, that's the filename
60+
final String filename = valuesFromRequest.get( 0 );
61+
62+
_filenameAssociation.setValue( filename, context.component() );
63+
64+
if( _dataAssociation != null ) {
65+
final UploadedFile file = request._uploadedFiles().get( filename );
66+
67+
try {
68+
byte[] data = file.stream().readAllBytes();
69+
_dataAssociation.setValue( data, context.component() );
70+
}
71+
catch( IOException e ) {
72+
throw new RuntimeException( e );
73+
}
74+
}
75+
}
76+
}
77+
}

ng-appserver/src/main/java/ng/appserver/templating/NGElementManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import ng.appserver.elements.NGBrowser;
1414
import ng.appserver.elements.NGComponentContent;
1515
import ng.appserver.elements.NGConditional;
16+
import ng.appserver.elements.NGFileUpload;
1617
import ng.appserver.elements.NGForm;
1718
import ng.appserver.elements.NGGenericContainer;
1819
import ng.appserver.elements.NGGenericElement;
@@ -254,6 +255,7 @@ public void registerFrameworkElementClasses() {
254255
registerElementClass( NGBrowser.class, "browser" );
255256
registerElementClass( NGComponentContent.class, "content" );
256257
registerElementClass( NGConditional.class, "if" );
258+
registerElementClass( NGFileUpload.class, "fileUpload" );
257259
registerElementClass( NGForm.class, "form" );
258260
registerElementClass( NGString.class, "str" );
259261
registerElementClass( NGGenericContainer.class, "container" );

0 commit comments

Comments
 (0)