[![Build Status](https://travis-ci.org/darviarush/perl-multipart-encoder.svg?branch=master)](https://travis-ci.org/darviarush/perl-multipart-encoder) [![MetaCPAN Release](https://badge.fury.io/pl/Multipart-Encoder.svg)](https://metacpan.org/release/Multipart-Encoder)
# NAME

Multipart::Encoder - encoder for mime-type `multipart/form-data`.

# VERSION

v0.0.3

# SINOPSIS

        `echo "Simple text." > /tmp/file.txt`;
        $?      #  0
        `gzip < /tmp/file.txt > /tmp/file.gz`;
        $?      #  0
        
        use Multipart::Encoder;
        
        my $multipart = Multipart::Encoder->new(
                x=>1,
                file_name => \"/tmp/file.txt",
                y=>[
                        "Content-Type" => "text/json",
                        name => 'my-name',
                        filename => 'my-filename',
                        _ => '{"count": 666}',
                        'Any-Header' => 123,
                ],
                z => {
                        _ => \'/tmp/file.gz',
                        'Any-Header' => 123,
                }
        )->buffer_size(2048)->boundary("xYzZY");
        
        my $str = $multipart->as_string;
        
        utf8::is_utf8($str)                     ## ""
        
        $str                                            #~ \r\n--xYzZY--\r\n\z
        
        $multipart->to("/tmp/file.form-data");
        
        open my $f, "<", "/tmp/file.form-data"; binmode $f; read $f, my $buf, -s $f; close $f;
        
        utf8::is_utf8($buf)                     ## ""
        
        $buf                                            ## $str
        
        $multipart->to(\*STDOUT);       ##>> $str
        

# DESCRIPTION

The encoder in 'multipart/form-data' is not represented in perl libraries. It is only used as part of other libraries, for example, C[HTTP::Tiny::Multipart](https://metacpan.org/pod/HTTP%3A%3ATiny%3A%3AMultipart).

But there is no such library for `AnyEvent::HTTP`.

The only module C[HTTP::Body::Builder::MultiPart](https://metacpan.org/pod/HTTP%3A%3ABody%3A%3ABuilder%3A%3AMultiPart) does not allow adding a file as a string to a **multipart**.

# INSTALL

`$ cpm install -g Multipart::Encoder`

# SUBROUTINES/METHODS

## new

Constructor.

        my $multipart1 = Multipart::Encoder->new;
        my $multipart2 = $multipart1->new;
        $multipart2     ##!= $multipart1
        
        ref Multipart::Encoder::new(0)  # 0
        

**Return** new object.

Arguments is a params for serialize to multipart-format.

        Multipart::Encoder->new(x=>123)->as_string    #~ 123    
        

## content\_type

        $multipart->content_type        # multipart/form-data
        

## buffer\_size

Set or get buffer size. Buffer using for write to file.

        $multipart->buffer_size(1024)->buffer_size              # 1024
        

Default buffer size:

        Multipart::Encoder->new->buffer_size                    # 2048
        

## boundary

Boundary is a separator before params in multipart-data.

        $multipart->boundary("XYZooo")->boundary                # XYZooo
        

Default boundary:

        Multipart::Encoder->new->boundary                               # xYzZY
        

## as\_string

Serialize params to a string.

        Multipart::Encoder->new(x=>123, y=>456)->as_string   #~ 123
        

## to

Serialize params and print it in multipart format to a file use buffer with `buffer_size`.
Argument for `to`  must by path or filehandle.

        $multipart->to("/tmp/file.form-data");
        
        open my $f, ">", "/tmp/file.form-data"; binmode $f;
        $multipart->to($f);
        close $f;
        

If file not open raise the die.

        $multipart->to("/")             #@ ~ Not open file `/`. Is a directory
        

# PARAMS

Param types is file and string.

## String param type

        Multipart::Encoder->new(x=>"Simple string")->as_string  #~ Simple string
        

With headers:

        my $str = Multipart::Encoder->new(
                x => {
                        _ => "Simple string",
                        header => 123,
                },
        )->as_string;
        
        $str #~ Simple string
        $str #~ header: 123
        

Header **Content-Disposition** added automically.

        Multipart::Encoder->new(x=>"Simple string")->as_string  #~ Content-Disposition: form-data; name="x"
        

Name in **Content-Disposition** set as key, or name-header:

        my $str = Multipart::Encoder->new(
                x => {
                        _ => "Simple string",
                        name => "xyz",
                },
        )->as_string;
        
        $str #~ Content-Disposition: form-data; name="xyz"
        

If need filename in **Content-Disposition**, add it:

        my $str = Multipart::Encoder->new(
                0 => {
                        _ => "Simple string",
                        filename => "xyz.tgz",
                },
        )->as_string;
        
        $str #~ Content-Disposition: form-data; name="0"; filename="xyz.tgz"
        

If **Content-Disposition** is, then it use once.

        my $str = Multipart::Encoder->new(
                x => {
                        _ => "Simple string",
                        'content-disposition' => "form-data; name=\"z\"; filename=\"xyz\"",
                },
        )->as_string;
        
        $str #~ content-disposition: form-data; name="z"; filename="xyz"
        

## File param type

Header **Content-Disposition** added automically.

        open my $f, ">/tmp/0"; close $f;
        
        Multipart::Encoder->new(x=>\"/tmp/0")->as_string        #~ Content-Disposition: form-data; name="x"; filename="0"
        

Header **Content-Type** added automically.

        Multipart::Encoder->new(x=>\"/tmp/file.gz")->as_string  #~ Content-Type: application/x-gzip; charset=binary
        

But if it is, then used once.

        my $str = Multipart::Encoder->new(
                x => [
                        _ => \"/tmp/file.gz",
                        'content-type' => 'text/plain',
                ]
        )->as_string;
        
        $str #~ content-type: text/plain
        $str #!~ Content-Type
        

Name in **Content-Disposition** set as key, or name-header:

        my $str = Multipart::Encoder->new(
                x => {
                        _ => \"/tmp/file.txt",
                        name => "xyz",
                },
        )->as_string;
        
        $str #~ Content-Disposition: form-data; name="xyz"; filename="file.txt"
        

If need filename in **Content-Disposition**, add it:

        my $str = Multipart::Encoder->new(
                0 => {
                        _ => \"/tmp/file.txt",
                        filename => "xyz.tgz",
                },
        )->as_string;
        
        $str #~ Content-Disposition: form-data; name="0"; filename="xyz.tgz"
        

If **Content-Disposition** is, then it use once.

        my $str = Multipart::Encoder->new(
                x => [
                        _ => \"/tmp/file.txt",
                        'content-disposition' => "form-data; name=\"z\"; filename=\"xyz\"",
                ],
        )->as_string;
        
        $str #~ content-disposition: form-data; name="z"; filename="xyz"
        

Big file.

        open my $f, ">", "/tmp/bigfile"; binmode $f; print $f 0 x 65534; close $f;
        Multipart::Encoder->new(x=>\"/tmp/bigfile")->as_string  #~ \n0{65534}\r
        

Raise if not open file.

        Multipart::Encoder->new(x=>\"/tmp/NnKkMm346485923")->as_string #@ ~ Not open file `/tmp/NnKkMm346485923`: No such file or directory 
        
        

# SEE ALSO

- CL[HTTP::Tiny::Multipart](https://metacpan.org/pod/HTTP%3A%3ATiny%3A%3AMultipart)
- CL[HTTP::Body::Builder::MultiPart](https://metacpan.org/pod/HTTP%3A%3ABody%3A%3ABuilder%3A%3AMultiPart)

# LICENSE

Copyright (C) Yaroslav O. Kosmina.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

# AUTHOR

Yaroslav O. Kosmina [mailto:darviarush@mail.ru](mailto:darviarush@mail.ru)