ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
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


 




Copyright © Lexa Software, 1996-2009.