@@ -26,6 +26,7 @@ import org.orbeon.oxf.xforms.event.EventCollector.ErrorEventCollector
26
26
import org .orbeon .oxf .xforms .event .XFormsEvent .*
27
27
import org .orbeon .oxf .xforms .event .events .*
28
28
import org .orbeon .oxf .xforms .event .{Dispatch , XFormsEvent }
29
+ import org .orbeon .oxf .xforms .upload .UploadCheckerLogic
29
30
import org .orbeon .oxf .xforms .xbl .XBLContainer
30
31
import org .orbeon .oxf .xml .XMLConstants .*
31
32
import org .orbeon .oxf .xml .XMLReceiverAdapter
@@ -86,23 +87,56 @@ class XFormsUploadControl(container: XBLContainer, parent: XFormsControl, elemen
86
87
// Upload canceled by the user
87
88
containingDocument.endUpload(getUploadUniqueId)
88
89
XFormsCrossPlatformSupport .removeUploadProgress(XFormsCrossPlatformSupport .externalContext.getRequest, this )
89
- case doneEvent : XXFormsUploadDoneEvent =>
90
- // Upload done: process upload to this control
91
- // Notify that the upload has ended
92
- containingDocument.endUpload(getUploadUniqueId)
93
- XFormsCrossPlatformSupport .removeUploadProgress(XFormsCrossPlatformSupport .externalContext.getRequest, this )
94
- handleUploadedFile(
95
- doneEvent.file,
96
- Option (doneEvent.filename).map(PathUtils .filenameFromPath), // in case the filename contains a path
97
- Option (doneEvent.contentType),
98
- Option (doneEvent.contentLength),
99
- collector
100
- )
101
- visitWithAncestors()
90
+ case _ : XXFormsUploadDoneEvent =>
91
+ // 2024-11-04: Now just a notification event
92
+ // https://github.com/orbeon/orbeon-forms/issues/6606
102
93
case _ : XXFormsUploadErrorEvent =>
103
- // Upload error: sent by the client in case of error
94
+ // Upload error: can be sent by the client in case of error, or as consequence of `xxforms-upload-store`
104
95
containingDocument.endUpload(getUploadUniqueId)
105
96
XFormsCrossPlatformSupport .removeUploadProgress(XFormsCrossPlatformSupport .externalContext.getRequest, this )
97
+ case storeEvent : XXFormsUploadStoreEvent =>
98
+ // https://github.com/orbeon/orbeon-forms/issues/6606
99
+ val size = storeEvent.contentLength.toLong
100
+ UploadCheckerLogic .checkSizeLimitExceeded(
101
+ maxSize = containingDocument.getUploadConstraintsForControl(effectiveId)._1,
102
+ currentSize = size
103
+ ) match {
104
+ case Some (maxSize) =>
105
+ XFormsCrossPlatformSupport .removeUploadProgress(XFormsCrossPlatformSupport .externalContext.getRequest, this )
106
+ Dispatch .dispatchEvent(
107
+ new XXFormsUploadErrorEvent (
108
+ this ,
109
+ Map (
110
+ " error-type" -> Some (" size-error" ),
111
+ " permitted" -> Some (maxSize),
112
+ " actual" -> Some (size)
113
+ )
114
+ ),
115
+ collector
116
+ )
117
+ case None =>
118
+ containingDocument.endUpload(getUploadUniqueId)
119
+ XFormsCrossPlatformSupport .removeUploadProgress(XFormsCrossPlatformSupport .externalContext.getRequest, this )
120
+ handleUploadedFile(
121
+ storeEvent.file,
122
+ Option (storeEvent.filename).map(PathUtils .filenameFromPath), // in case the filename contains a path
123
+ Option (storeEvent.contentType),
124
+ Option (storeEvent.contentLength),
125
+ collector
126
+ )
127
+ visitWithAncestors()
128
+ Dispatch .dispatchEvent(
129
+ new XXFormsUploadDoneEvent (
130
+ this ,
131
+ Map (
132
+ " filename" -> Option (storeEvent.filename),
133
+ " content-type" -> Option (storeEvent.contentType),
134
+ " content-length" -> Option (storeEvent.contentLength)
135
+ )
136
+ ),
137
+ collector
138
+ )
139
+ }
106
140
case _ =>
107
141
}
108
142
}
0 commit comments