cvs: php4 / rfc1867.c

From: Date: Sun, 04 Jun 2000 05:46:28 +0000
Subject: cvs: php4 / rfc1867.c
Groups: php.version4 
Request: Send a blank email to php-version4+get-16123@lists.php.net to get a copy of this message
rasmus Sat Jun 3 22:46:28 2000 EDT Modified files: /php4 rfc1867.c Log: @ Add support for both indexed and non-indexed arrays of file uploads @ eg. name="file[]" type="file" (Rasmus) Add support for both indexed and non-indexed arrays of file uploads eg. name="file[]" type="file" (Rasmus) Index: php4/rfc1867.c diff -u php4/rfc1867.c:1.35 php4/rfc1867.c:1.36 --- php4/rfc1867.c:1.35 Thu May 18 08:34:21 2000 +++ php4/rfc1867.c Sat Jun 3 22:46:28 2000 @@ -12,10 +12,10 @@ | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ - | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> | + | Authors: Rasmus Lerdorf <rasmus@php.net> | +----------------------------------------------------------------------+ */ -/* $Id: rfc1867.c,v 1.35 2000/05/18 15:34:21 zeev Exp $ */ +/* $Id: rfc1867.c,v 1.36 2000/06/04 05:46:28 rasmus Exp $ */ #include <stdio.h> #include "php.h" @@ -28,7 +28,7 @@ #define NEW_BOUNDARY_CHECK 1 -#define SAFE_RETURN { if (namebuf) efree(namebuf); if (filenamebuf) efree(filenamebuf); if (lbuf) efree(lbuf); return; } +#define SAFE_RETURN { if (namebuf) efree(namebuf); if (filenamebuf) efree(filenamebuf); if (lbuf) efree(lbuf); if (abuf) efree(abuf); if(arr_index) efree(arr_index); return; } /* The longest property name we use in an uploaded file array */ #define MAX_SIZE_OF_INDEX sizeof("[tmp_name]") @@ -63,9 +63,10 @@ int len, state = 0, Done = 0, rem, urem; int eolsize; long bytes, max_file_size = 0; - char *namebuf=NULL, *filenamebuf=NULL, *lbuf=NULL; + char *namebuf=NULL, *filenamebuf=NULL, *lbuf=NULL, + *abuf=NULL, *start_arr=NULL, *end_arr=NULL, *arr_index=NULL; FILE *fp; - int itype; + int itype, is_arr_upload=0, arr_len=0; zval *http_post_files=NULL; ELS_FETCH(); PLS_FETCH(); @@ -134,6 +135,19 @@ loc2 = memchr(loc + 1, '\n', rem); rem -= (loc2 - ptr) + 1; ptr = loc2 + 1; + /* is_arr_upload is true when name of file upload field + * ends in [.*] + * start_arr is set to point to 1st [ + * end_arr points to last ] + */ + is_arr_upload = (start_arr = strrchr(namebuf,'[')) && + (end_arr = strrchr(namebuf,']')) && + (end_arr = namebuf+strlen(namebuf)-1); + if(is_arr_upload) { + arr_len = strlen(start_arr); + if(arr_index) efree(arr_index); + arr_index = estrndup(start_arr+1,arr_len-1); + } } else { php_error(E_WARNING, "File upload error - no name component in content disposition"); SAFE_RETURN; @@ -152,7 +166,15 @@ filenamebuf = estrndup(filename, s-filename); /* Add $foo_name */ - sprintf(lbuf, "%s_name", namebuf); + if (is_arr_upload) { + if (abuf) { + efree(abuf); + } + abuf = estrndup(namebuf, strlen(namebuf)-arr_len); + sprintf(lbuf, "%s_name[%s]", abuf, arr_index); + } else { + sprintf(lbuf, "%s_name", namebuf); + } s = strrchr(filenamebuf, '\\'); if (s && s > filenamebuf) { php_register_variable(lbuf, s+1, NULL ELS_CC PLS_CC); @@ -161,7 +183,11 @@ } /* Add $foo[name] */ - sprintf(lbuf, "%s[name]", namebuf); + if (is_arr_upload) { + sprintf(lbuf, "%s[name][%s]", abuf, arr_index); + } else { + sprintf(lbuf, "%s[name]", namebuf); + } if (s && s > filenamebuf) { register_http_post_files_variable(lbuf, s+1, http_post_files ELS_CC PLS_CC); } else { @@ -174,11 +200,19 @@ *(loc2 - 1) = '\0'; /* Add $foo_type */ - sprintf(lbuf, "%s_type", namebuf); + if (is_arr_upload) { + sprintf(lbuf, "%s_type[%s]", abuf, arr_index); + } else { + sprintf(lbuf, "%s_type", namebuf); + } php_register_variable(lbuf, loc+15, NULL ELS_CC PLS_CC); /* Add $foo[type] */ - sprintf(lbuf, "%s[type]", namebuf); + if (is_arr_upload) { + sprintf(lbuf, "%s[type][%s]", abuf, arr_index); + } else { + sprintf(lbuf, "%s[type]", namebuf); + } register_http_post_files_variable(lbuf, loc+15, http_post_files ELS_CC PLS_CC); *(loc2 - 1) = '\n'; @@ -272,7 +306,11 @@ php_register_variable(namebuf, fn, NULL ELS_CC PLS_CC); /* Add $foo[tmp_name] */ - sprintf(lbuf, "%s[tmp_name]", namebuf); + if(is_arr_upload) { + sprintf(lbuf, "%s[tmp_name][%s]", abuf, arr_index); + } else { + sprintf(lbuf, "%s[tmp_name]", namebuf); + } register_http_post_files_variable(lbuf, fn, http_post_files ELS_CC PLS_CC); { zval file_size; @@ -281,11 +319,19 @@ file_size.type = IS_LONG; /* Add $foo_size */ - sprintf(lbuf, "%s_size", namebuf); + if(is_arr_upload) { + sprintf(lbuf, "%s_size[%s]", abuf, arr_index); + } else { + sprintf(lbuf, "%s_size", namebuf); + } php_register_variable_ex(lbuf, &file_size, NULL ELS_CC PLS_CC); /* Add $foo[size] */ - sprintf(lbuf, "%s[size]", namebuf); + if(is_arr_upload) { + sprintf(lbuf, "%s[size][%s]", abuf, arr_index); + } else { + sprintf(lbuf, "%s[size]", namebuf); + } register_http_post_files_variable_ex(lbuf, &file_size, http_post_files ELS_CC PLS_CC); } state = 0;

« previous php.version4 (#16123) next »