diff --git a/include/libwebsockets/lws-spa.h b/include/libwebsockets/lws-spa.h
index fcaf3889f584b4053a147d44f07fc9dbc90ead6b..89627c318c4f88940d98261647899cb7487c35a7 100644
--- a/include/libwebsockets/lws-spa.h
+++ b/include/libwebsockets/lws-spa.h
@@ -47,8 +47,10 @@ enum lws_spa_fileupload_states {
 	/**< a chunk of file content has arrived */
 	LWS_UFS_FINAL_CONTENT,
 	/**< the last chunk (possibly zero length) of file content has arrived */
-	LWS_UFS_OPEN
+	LWS_UFS_OPEN,
 	/**< a new file is starting to arrive */
+	LWS_UFS_CLOSE
+	/**< the file decode stuff is being destroyed */
 };
 
 /**
diff --git a/lib/roles/http/server/lws-spa.c b/lib/roles/http/server/lws-spa.c
index 190b5023eac05826018a5a06b68d1d058ec050a2..bc8d3ce64123818433d962ba2f83ad8d3be6ce50 100644
--- a/lib/roles/http/server/lws-spa.c
+++ b/lib/roles/http/server/lws-spa.c
@@ -136,7 +136,8 @@ lws_urldecode_s_process(struct lws_urldecode_stateful *s, const char *in,
 
 	while (len--) {
 		if (s->pos == s->out_len - s->mp - 1) {
-			if (s->output(s->data, s->name, &s->out, s->pos, 0))
+			if (s->output(s->data, s->name, &s->out, s->pos,
+				      LWS_UFS_CONTENT))
 				return -1;
 
 			was_end = s->pos;
@@ -158,7 +159,7 @@ lws_urldecode_s_process(struct lws_urldecode_stateful *s, const char *in,
 			if (*in == '&') {
 				s->name[s->pos] = '\0';
 				if (s->output(s->data, s->name, &s->out,
-					      s->pos, 1))
+					      s->pos, LWS_UFS_FINAL_CONTENT))
 					return -1;
 				s->pos = 0;
 				s->state = US_IDLE;
@@ -180,7 +181,7 @@ lws_urldecode_s_process(struct lws_urldecode_stateful *s, const char *in,
 			if (*in == '&') {
 				s->out[s->pos] = '\0';
 				if (s->output(s->data, s->name, &s->out,
-					      s->pos, 1))
+					      s->pos, LWS_UFS_FINAL_CONTENT))
 					return -1;
 				s->pos = 0;
 				s->state = US_NAME;
@@ -229,7 +230,8 @@ retry_as_first:
 
 					if (s->pos || was_end)
 						if (s->output(s->data, s->name,
-						      &s->out, s->pos, 1))
+						      &s->out, s->pos,
+						      LWS_UFS_FINAL_CONTENT))
 							return -1;
 
 					s->pos = 0;
@@ -409,9 +411,13 @@ lws_urldecode_s_destroy(struct lws_urldecode_stateful *s)
 		ret = -1;
 
 	if (!ret)
-		if (s->output(s->data, s->name, &s->out, s->pos, 1))
+		if (s->output(s->data, s->name, &s->out, s->pos,
+			      LWS_UFS_FINAL_CONTENT))
 			ret = -1;
 
+	if (s->output(s->data, s->name, NULL, 0, LWS_UFS_CLOSE))
+		return -1;
+
 	lws_free(s);
 
 	return ret;
@@ -448,15 +454,14 @@ static int
 lws_urldecode_spa_cb(void *data, const char *name, char **buf, int len,
 		     int final)
 {
-	struct lws_spa *spa =
-			(struct lws_spa *)data;
+	struct lws_spa *spa = (struct lws_spa *)data;
 	int n;
 
-	if (spa->s->content_disp_filename[0]) {
+	if (final == LWS_UFS_CLOSE || spa->s->content_disp_filename[0]) {
 		if (spa->opt_cb) {
 			n = spa->opt_cb(spa->opt_data, name,
 					spa->s->content_disp_filename,
-					*buf, len, final);
+					buf ? *buf : NULL, len, final);
 
 			if (n < 0)
 				return -1;
diff --git a/minimal-examples/http-server/minimal-http-server-form-post-file/minimal-http-server-form-post-file.c b/minimal-examples/http-server/minimal-http-server-form-post-file/minimal-http-server-form-post-file.c
index 0abc714a8b556ef477beb8213b784e48bda911d9..4f669fa090390863ed3451196473fdd85365b0c5 100644
--- a/minimal-examples/http-server/minimal-http-server-form-post-file/minimal-http-server-form-post-file.c
+++ b/minimal-examples/http-server/minimal-http-server-form-post-file/minimal-http-server-form-post-file.c
@@ -88,6 +88,8 @@ file_upload_cb(void *data, const char *name, const char *filename,
 		close(pss->fd);
 		pss->fd = -1;
 		break;
+	case LWS_UFS_CLOSE:
+		break;
 	}
 
 	return 0;
diff --git a/plugins/deaddrop/protocol_lws_deaddrop.c b/plugins/deaddrop/protocol_lws_deaddrop.c
index 9fa851b29a99df5be0a11518cdd719d73ad9477b..7c40f6933652397271a70d266bffd71493fab3d9 100644
--- a/plugins/deaddrop/protocol_lws_deaddrop.c
+++ b/plugins/deaddrop/protocol_lws_deaddrop.c
@@ -322,6 +322,8 @@ file_upload_cb(void *data, const char *name, const char *filename,
 		pss->response_code = HTTP_STATUS_OK;
 		scan_upload_dir(pss->vhd);
 
+		break;
+	case LWS_UFS_CLOSE:
 		break;
 	}
 
diff --git a/plugins/protocol_post_demo.c b/plugins/protocol_post_demo.c
index e373cf647e36f7f6cb7531d6c64245e194335911..927f7a8148ff8fd34a0d8f4fb06b3b2d0d56148f 100644
--- a/plugins/protocol_post_demo.c
+++ b/plugins/protocol_post_demo.c
@@ -107,6 +107,8 @@ file_upload_cb(void *data, const char *name, const char *filename,
 		pss->fd = LWS_INVALID_FILE;
 #endif
 		break;
+	case LWS_UFS_CLOSE:
+		break;
 	}
 
 	return 0;