Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Upload module + множественная загрузка
dimkalinux пишет:
При попытке использования множественной загрузки
<input type="file" name="upload[]" tabindex="1" multiple="true"/>
получается такой результат, print_r($_POST)
Firefox 3.6 / Chromium
Array
(
[form_sent] => 1
[upload] => Array
(
[0] => cats.jpg
[1] => image/jpeg
[2] => /var/upload/pic/tmp/0000000598
[3] => 58239
[4] => Glider.png
[5] => image/png
[6] => /var/upload/pic/tmp/0000000599
[7] => 724
)
)
то есть пропадают названия полей.
Если имя указать как name="upload" без скобок, то названия полей
появляются, но загружается только 1 файл.
Первый патч во вложении добавляет директиву upload_tame_arrays. Если
установить upload_tame_arrays в yes, то квадратные скобки в файловых
полях, приходящих от клиента, будут удалены. Соответственно, в
конфигурации необходимо выполнить обратную операцию, например так:
upload_set_form_field "${upload_field_name}_name[]" "$upload_file_name";
upload_set_form_field "${upload_field_name}_content_type[]"
"$upload_content_type";
upload_set_form_field "${upload_field_name}_path[]" "$upload_tmp_path";
Полагаю, должно помочь.
В Опере ещё хуже:
C 1-м файлом все работает, но при множественной загрузке Опера шлет
файлы в формате multipart/mixed и похоже что upload module с ним не
работает ? POST приходит пустым.
Планируются ли исправления этих ситуаций в новых версиях модуля?
Вообще-то, при получении multipart/mixed должна возвращаться ошибка 415.
Тем не менее, судя по описанию, multipart/mixed добавить не сложно
(второй патч).
--
Best regards,
Valery Kholodkov
diff --git a/ngx_http_upload_module.c b/ngx_http_upload_module.c
index 220464f..2a4e388 100644
--- a/ngx_http_upload_module.c
+++ b/ngx_http_upload_module.c
@@ -103,6 +103,7 @@ typedef struct {
ngx_array_t *field_filters;
ngx_array_t *cleanup_statuses;
ngx_flag_t forward_args;
+ ngx_flag_t tame_arrays;
size_t limit_rate;
unsigned int md5:1;
@@ -444,6 +445,17 @@ static ngx_command_t ngx_http_upload_commands[] = { /*
{{{ */
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_upload_loc_conf_t, limit_rate),
NULL },
+
+ /*
+ * Specifies whether array brackets in file field names must be dropped
+ */
+ { ngx_string("upload_tame_arrays"),
+
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_HTTP_LIF_CONF
+ |NGX_CONF_FLAG,
+ ngx_conf_set_flag_slot,
+ NGX_HTTP_LOC_CONF_OFFSET,
+ offsetof(ngx_http_upload_loc_conf_t, tame_arrays),
+ NULL },
ngx_null_command
}; /* }}} */
@@ -813,6 +825,14 @@ static ngx_int_t
ngx_http_upload_start_handler(ngx_http_upload_ctx_t *u) { /* {{
ucln->aborted = 0;
if(ulcf->field_templates) {
+
+ if(ulcf->tame_arrays &&
+ u->field_name.data[u->field_name.len - 1] == ']' &&
+ u->field_name.data[u->field_name.len - 2] == '[')
+ {
+ u->field_name.len -= 2;
+ }
+
t = ulcf->field_templates->elts;
for (i = 0; i < ulcf->field_templates->nelts; i++) {
@@ -1174,6 +1194,7 @@ ngx_http_upload_create_loc_conf(ngx_conf_t *cf)
conf->store_access = NGX_CONF_UNSET_UINT;
conf->forward_args = NGX_CONF_UNSET;
+ conf->tame_arrays = NGX_CONF_UNSET;
conf->buffer_size = NGX_CONF_UNSET_SIZE;
conf->max_header_len = NGX_CONF_UNSET_SIZE;
@@ -1239,6 +1260,11 @@ ngx_http_upload_merge_loc_conf(ngx_conf_t *cf, void
*parent, void *child)
prev->forward_args : 0;
}
+ if(conf->tame_arrays == NGX_CONF_UNSET) {
+ conf->tame_arrays = (prev->tame_arrays != NGX_CONF_UNSET) ?
+ prev->tame_arrays : 0;
+ }
+
if(conf->field_templates == NULL) {
conf->field_templates = prev->field_templates;
}
diff --git a/ngx_http_upload_module.c b/ngx_http_upload_module.c
index 220464f..a60b30c 100644
--- a/ngx_http_upload_module.c
+++ b/ngx_http_upload_module.c
@@ -27,6 +27,7 @@
#endif
#define MULTIPART_FORM_DATA_STRING "multipart/form-data"
+#define MULTIPART_MIXED_STRING "multipart/mixed"
#define BOUNDARY_STRING "boundary="
#define CONTENT_DISPOSITION_STRING "Content-Disposition:"
#define CONTENT_TYPE_STRING "Content-Type:"
@@ -2386,9 +2387,12 @@ static ngx_int_t
upload_parse_content_type(ngx_http_upload_ctx_t *upload_ctx, ng
}
if(ngx_strncasecmp(content_type->data, (u_char*)
MULTIPART_FORM_DATA_STRING,
- sizeof(MULTIPART_FORM_DATA_STRING) - 1)) {
+ sizeof(MULTIPART_FORM_DATA_STRING) - 1) &&
+ ngx_strncasecmp(content_type->data, (u_char*) MULTIPART_MIXED_STRING,
+ sizeof(MULTIPART_MIXED_STRING) - 1))
+ {
ngx_log_error(NGX_LOG_ERR, upload_ctx->log, 0,
- "Content-Type is not multipart/form-data: %V",
content_type);
+ "Content-Type is neither multipart/form-data nor
multipart/mixed: %V", content_type);
return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;
}
_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru
|