upload module parameters issue

Francis Daly francis at daoine.org
Mon Oct 3 23:23:41 UTC 2011

On Mon Oct 3 19:04:22 UTC 2011, Andrew Hammond wrote: 

Hi there,

> 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;
> upload_aggregate_form_field "${upload_field_name}_sha1" $upload_file_sha1;
> upload_aggregate_form_field "${upload_field_name}_size" $upload_file_size;

Note that "resumable" can apply to a single file, without any
$upload_field_name set, so you'll get things like "_name" and
"_content_type" in your final post content.

> I upload to the system using the following (see
> https://github.com/SmartReceipt/py_lightweight_uploader):

One important off-by-one error there:

--- py_lightweight_uploader.py	2011-10-03 23:37:18.000000000 +0100
+++ py_lightweight_uploader.py	2011-10-03 23:40:24.000000000 +0100
@@ -188,7 +188,7 @@
     def next_content_range(self):
         plus_chunk = self.last_byte_uploaded + self.chunk_size - 1
-        top_bound = plus_chunk if plus_chunk < self.total_file_size else self.total_file_size
+        top_bound = plus_chunk if plus_chunk < self.total_file_size else self.total_file_size - 1
         return 'bytes %d-%d/%d' % (self.last_byte_uploaded, top_bound, self.total_file_size)

> Please note that despite the error message on line 680, the uploaded file is
> byte-for-byte identical to the source file. Error message follows:
> 2011/10/03 10:58:46 [error] 8111#0: *35 file offset at the end of a part
> 210000 does not match the end specified range 204796-210000/210000, client:
>, server: account.nutricateonline.com, request: "POST
> /rspool/?a=b&c=d HTTP/1.0", host: ""

The range is expected to be 204796-209999/210000, as patched above.

> I think that having request.FILES empty is correct. The two parameters in
> the GET dictionary are from the command line (also correct). However I think
> the upload parameters should be represented somewhere. Can anyone suggest
> next steps?

They'll be in the POST dictionary when the client is right.

Note that you are also double-sending the last byte of each chunk --
make chunk_size be 1 or 2 and send a small file, and you'll see the
problem. The receiving side can handle the double-send, so it's an
inefficiency rather than a protocol error.

But with 50kB chunks, that last range should really be

Good luck with it,

Francis Daly        francis at daoine.org

More information about the nginx mailing list