123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- .\" You can view this file with:
- .\" nroff -man [file]
- .\" $Id: curl_formadd.3,v 1.8 2004/02/27 15:34:06 bagder Exp $
- .\"
- .TH curl_formadd 3 "24 June 2002" "libcurl 7.9.8" "libcurl Manual"
- .SH NAME
- curl_formadd - add a section to a multipart/formdata HTTP POST
- .SH SYNOPSIS
- .B #include <curl/curl.h>
- .sp
- .BI "CURLFORMcode curl_formadd(struct curl_httppost ** " firstitem,
- .BI "struct curl_httppost ** " lastitem, " ...);"
- .ad
- .SH DESCRIPTION
- curl_formadd() is used to append sections when building a multipart/formdata
- HTTP POST (sometimes refered to as rfc1867-style posts). Append one section at
- a time until you've added all the sections you want included and then you pass
- the \fIfirstitem\fP pointer as parameter to \fBCURLOPT_HTTPPOST\fP.
- \fIlastitem\fP is set after each call and on repeated invokes it should be
- left as set to allow repeated invokes to find the end of the list faster.
- After the \fIlastitem\fP pointer follow the real arguments.
- The pointers \fI*firstitem\fP and \fI*lastitem\fP should both be pointing to
- NULL in the first call to this function. All list-data will be allocated by
- the function itself. You must call \fIcurl_formfree\fP after the form post has
- been done to free the resources again.
- First, there are some basics you need to understand about multipart/formdata
- posts. Each part consists of at least a NAME and a CONTENTS part. If the part
- is made for file upload, there are also a stored CONTENT-TYPE and a
- FILENAME. Below here, we'll discuss on what options you use to set these
- properties in the parts you want to add to your post.
- .SH OPTIONS
- .B CURLFORM_COPYNAME
- followed by string is used to set the name of this part. libcurl copies the
- given data, so your application doesn't need to keep it around after this
- function call. If the name isn't zero terminated properly, or if you'd like it
- to contain zero bytes, you need to set the length of the name with
- \fBCURLFORM_NAMELENGTH\fP.
- .B CURLFORM_PTRNAME
- followed by a string is used for the name of this part. libcurl will use the
- pointer and refer to the data in your application, you must make sure it
- remains until curl no longer needs it. If the name isn't zero terminated
- properly, or if you'd like it to contain zero bytes, you need to set the
- length of the name with \fBCURLFORM_NAMELENGTH\fP.
- .B CURLFORM_COPYCONTENTS
- followed by a string is used for the contents of this part, the actual data to
- send away. libcurl copies the given data, so your application doesn't need to
- keep it around after this function call. If the data isn't zero terminated
- properly, or if you'd like it to contain zero bytes, you need to set the
- length of the name with \fBCURLFORM_CONTENTSLENGTH\fP.
- .B CURLFORM_PTRCONTENTS
- followed by a string is used for the contents of this part, the actual data to
- send away. libcurl will use the pointer and refer to the data in your
- application, you must make sure it remains until curl no longer needs it. If
- the data isn't zero terminated properly, or if you'd like it to contain zero
- bytes, you need to set the length of the name with
- \fBCURLFORM_CONTENTSLENGTH\fP.
- .B CURLFORM_FILECONTENT
- followed by a file name, makes that file read and the contents will be used in
- as data in this part.
- .B CURLFORM_FILE
- followed by a file name, makes this part a file upload part. It sets the file
- name field to the actual file name used here, it gets the contents of the file
- and passes as data and sets the content-type if the given file match one of
- the new internally known file extension. For \fBCURLFORM_FILE\fP the user may
- send one or more files in one part by providing multiple \fBCURLFORM_FILE\fP
- arguments each followed by the filename (and each CURLFORM_FILE is allowed to
- have a CURLFORM_CONTENTTYPE).
- .B CURLFORM_CONTENTTYPE
- followed by a pointer to a string with a content-type will make curl use this
- given content-type for this file upload part, possibly instead of an
- internally chosen one.
- .B CURLFORM_FILENAME
- followed by a pointer to a string to a name, will make libcurl use the given
- name in the file upload part, intead of the actual file name given to
- \fICURLFORM_FILE\fP.
- .B BCURLFORM_BUFFER
- followed by a string, tells libcurl that a buffer is to be used to upload data
- instead of using a file. The given string is used as the value of the file
- name field in the content header.
- .B CURLFORM_BUFFERPTR
- followed by a pointer to a data area, tells libcurl the address of the buffer
- containing data to upload (as indicated with \fICURLFORM_BUFFER\fP). The
- buffer containing this data must not be freed until after
- \fIcurl_easy_cleanup(3)\fP is called.
- .B CURLFORM_BUFFERLENGTH
- followed by a long with the size of the \fICURLFORM_BUFFERPTR\fP data area,
- tells libcurl the length of the buffer to upload.
- .B CURLFORM_ARRAY
- Another possibility to send options to curl_formadd() is the
- \fBCURLFORM_ARRAY\fP option, that passes a struct curl_forms array pointer as
- its value. Each curl_forms structure element has a CURLformoption and a char
- pointer. The final element in the array must be a CURLFORM_END. All available
- options can be used in an array, except the CURLFORM_ARRAY option itself! The
- last argument in such an array must always be \fBCURLFORM_END\fP.
- .B CURLFORM_CONTENTHEADER
- specifies extra headers for the form POST section. This takes a curl_slist
- prepared in the usual way using \fBcurl_slist_append\fP and appends the list
- of headers to those libcurl automatically generates. The list must exist while
- the POST occurs, if you free it before the post completes you may experience
- problems.
- When you've passed the HttpPost pointer to \fIcurl_easy_setopt(3)\fP (using
- the \fICURLOPT_HTTPPOST\fP option), you must not free the list until after
- you've called \fIcurl_easy_cleanup(3)\fP for the curl handle.
- See example below.
- .SH RETURN VALUE
- 0 means everything was ok, non-zero means an error occurred as
- .I <curl/curl.h>
- defines.
- .SH EXAMPLE
- .nf
- struct HttpPost* post = NULL;
- struct HttpPost* last = NULL;
- char namebuffer[] = "name buffer";
- long namelength = strlen(namebuffer);
- char buffer[] = "test buffer";
- char htmlbuffer[] = "<HTML>test buffer</HTML>";
- long htmlbufferlength = strlen(htmlbuffer);
- struct curl_forms forms[3];
- char file1[] = "my-face.jpg";
- char file2[] = "your-face.jpg";
- /* add null character into htmlbuffer, to demonstrate that
- transfers of buffers containing null characters actually work
- */
- htmlbuffer[8] = '\\0';
- /* Add simple name/content section */
- curl_formadd(&post, &last, CURLFORM_COPYNAME, "name",
- CURLFORM_COPYCONTENTS, "content", CURLFORM_END);
- /* Add simple name/content/contenttype section */
- curl_formadd(&post, &last, CURLFORM_COPYNAME, "htmlcode",
- CURLFORM_COPYCONTENTS, "<HTML></HTML>",
- CURLFORM_CONTENTTYPE, "text/html", CURLFORM_END);
- /* Add name/ptrcontent section */
- curl_formadd(&post, &last, CURLFORM_COPYNAME, "name_for_ptrcontent",
- CURLFORM_PTRCONTENTS, buffer, CURLFORM_END);
- /* Add ptrname/ptrcontent section */
- curl_formadd(&post, &last, CURLFORM_PTRNAME, namebuffer,
- CURLFORM_PTRCONTENTS, buffer, CURLFORM_NAMELENGTH,
- namelength, CURLFORM_END);
- /* Add name/ptrcontent/contenttype section */
- curl_formadd(&post, &last, CURLFORM_COPYNAME, "html_code_with_hole",
- CURLFORM_PTRCONTENTS, htmlbuffer,
- CURLFORM_CONTENTSLENGTH, htmlbufferlength,
- CURLFORM_CONTENTTYPE, "text/html", CURLFORM_END);
- /* Add simple file section */
- curl_formadd(&post, &last, CURLFORM_COPYNAME, "picture",
- CURLFORM_FILE, "my-face.jpg", CURLFORM_END);
- /* Add file/contenttype section */
- curl_formadd(&post, &last, CURLFORM_COPYNAME, "picture",
- CURLFORM_FILE, "my-face.jpg",
- CURLFORM_CONTENTTYPE, "image/jpeg", CURLFORM_END);
- /* Add two file section */
- curl_formadd(&post, &last, CURLFORM_COPYNAME, "pictures",
- CURLFORM_FILE, "my-face.jpg",
- CURLFORM_FILE, "your-face.jpg", CURLFORM_END);
- /* Add two file section using CURLFORM_ARRAY */
- forms[0].option = CURLFORM_FILE;
- forms[0].value = file1;
- forms[1].option = CURLFORM_FILE;
- forms[1].value = file2;
- forms[2].option = CURLFORM_END;
- /* Add a buffer to upload */
- curl_formadd(&post, &last,
- CURLFORM_COPYNAME, "name",
- CURLFORM_BUFFER, "data",
- CURLFORM_BUFFERPTR, record,
- CURLFORM_BUFFERLENGTH, record_length,
- CURLFORM_END);
- /* no option needed for the end marker */
- curl_formadd(&post, &last, CURLFORM_COPYNAME, "pictures",
- CURLFORM_ARRAY, forms, CURLFORM_END);
- /* Add the content of a file as a normal post text value */
- curl_formadd(&post, &last, CURLFORM_COPYNAME, "filecontent",
- CURLFORM_FILECONTENT, ".bashrc", CURLFORM_END);
- /* Set the form info */
- curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
- .SH "SEE ALSO"
- .BR curl_easy_setopt "(3), "
- .BR curl_formparse "(3) [deprecated], "
- .BR curl_formfree "(3)"
|