httppost上傳文件
Ⅰ HTTP 是怎麼實現文件傳輸的
小文件可以在post時順帶發過去。
大文件可以用數據流模式傳輸 inputstream/outputstream 在瀏覽器里放控制項 activex,applet,flash等等應該都可以。
Ⅱ 如何解析HTTP POST文件上傳流
POST /upload.jsp HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Content-Type: multipart/form-data; boundary=---------------------------7da29f2d890386
Host: abc.com
Content-Length: 1516663
Connection: Keep-Alive
Cache-Control: no-cache
-----------------------------7da29f2d890386
Content-Disposition: form-data; name="ServerPath"
localhost
-----------------------------7da29f2d890386
Content-Disposition: form-data; name="id"
12323123
-----------------------------7da29f2d890386
Content-Disposition: form-data; name="FileData"; filename="D:\set.pdf"
Content-Type: application/pdf
%PDF-1.6
%����
1 0 obj<</Type/Page/Contents 2 0 R/Parent 3 0 R/Resources 4 0 R/CropBox[0 0 595.22 842]/MediaBox[0 0 595.22 842]/Rotate 0>>
endobj
4 0 obj<</ColorSpace<</Cs6 5 0 R>>/ExtGState<</GS1 6 0 R>>/ProcSet[/PDF/Text]/Font<</F1 7 0 R/F3 8 0 R/TT3 9 0 R/F2 10 0 R>>>>
endobj
2 0 obj <</Filter/FlateDecode/Length 1887>>stream
-----------------------------7da29f2d890386--
Ⅲ android的自帶的httpClient 怎麼上傳文件
Android上傳文件到服務端可以使用HttpConnection 上傳文件,也可以使用Android封裝好的HttpClient類。當僅僅上傳文件可以直接使用httpconnection 上傳比較方便快捷。
1、使用HttpConection上傳文件。將文件轉換成表單數據流。主要的思路就自己構造個http協議內容,服務端解析報文獲得表單數據。代碼片段:
[java] view plain
HttpURLConnection con;
try {
con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(C_TimeOut);
/* 允許Input、Output,不使用Cache */
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
/* 設置傳送的method=POST */
con.setRequestMethod("POST");
/* setRequestProperty */
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Charset", "UTF-8");
con.setRequestProperty("Content-Type","multipart/form-data;boundary=" + boundary);
/* 設置DataOutputStream */
DataOutputStream ds = new DataOutputStream(con.getOutputStream());
FileInputStream fStream = new FileInputStream(file);
/* 設置每次寫入1024bytes */
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int length = -1;
/* 從文件讀取數據至緩沖區 */
while((length = fStream.read(buffer)) != -1)
{
/* 將資料寫入DataOutputStream中 */
ds.write(buffer, 0, length);
}
fStream.close();
ds.flush();
ds.close();
可以參考
①《在 Android 上通過模擬 HTTP multipart/form-data 請求協議信息實現圖片上傳》 (http://bertlee.iteye.com/blog/1134576)。
②《關於android Http訪問,上傳,用了三個方法 》
2、使用Android HttpClient類上傳參數。下面我在網上搜到得代碼,忘記出處了
[java] view plain
private static boolean sendPOSTRequestHttpClient(String path,
Map<String, String> params) throws Exception {
// 封裝請求參數
List<NameValuePair> pair = new ArrayList<NameValuePair>();
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, String> entry : params.entrySet()) {
pair.add(new BasicNameValuePair(entry.getKey(), entry
.getValue()));
}
}
// 把請求參數變成請求體部分
UrlEncodedFormEntity uee = new UrlEncodedFormEntity(pair, "utf-8");
// 使用HttpPost對象設置發送的URL路徑
HttpPost post = new HttpPost(path);
// 發送請求體
post.setEntity(uee);
// 創建一個瀏覽器對象,以把POST對象向伺服器發送,並返回響應消息
DefaultHttpClient dhc = new DefaultHttpClient();
HttpResponse response = dhc.execute(post);
if (response.getStatusLine().getStatusCode() == 200) {
Log.i("http", "httpclient");
return true;
}
return false;
}
3、使用httpClient上傳文字信息和文件信息。使用httpClient上傳文件非常的方便。不過需要導入apache-mime4j-0.6.jar 和httpmime-4.0.jar兩個.jar包。
[java] view plain
// 封裝請求參數
MultipartEntity mpEntity = new MultipartEntity();
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, String> entry : params.entrySet()) {
StringBody par = new StringBody(entry.getValue());
mpEntity.addPart(entry.getKey(), par);
}
}
// 圖片
if (!imagepath.equals("")) {
FileBody file = new FileBody(new File(imagepath));
mpEntity.addPart("photo", file);
}
// 使用HttpPost對象設置發送的URL路徑
HttpPost post = new HttpPost(path);
// 發送請求體
post.setEntity(mpEntity);
// 創建一個瀏覽器對象,以把POST對象向伺服器發送,並返回響應消息
DefaultHttpClient dhc = new DefaultHttpClient();
HttpResponse response = dhc.execute(post);
FileBody類可以把文件封裝到表單中,實現附件的上傳。
關於httpClient上傳文件可以參考鏈接: http://www.eoeandroid.com/forum.php?mod=viewthread&tid=76721&page=1
需要用的的ja下載地址r:http://download.csdn.net/detail/china1988s/3791514
參考:
①《在 Android 上通過模擬 HTTP multipart/form-data 請求協議信息實現圖片上傳》 (http://bertlee.iteye.com/blog/1134576)。
②《關於android Http訪問,上傳,用了三個方法 》
Ⅳ Android中使用HttpPost實現數據與文件同時上傳的功能
第一步:編寫一個Servlet,把接收到的HTTP信息保存在一個文件中,代碼如下:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//獲取輸入流,是HTTP協議中的實體內容
ServletInputStream sis=request.getInputStream();
//緩沖區
byte buffer[]=new byte[1024];
FileOutputStream fos=new FileOutputStream("d://file.log");
int len=sis.read(buffer, 0, 1024);
//把流里的信息循環讀入到file.log文件中
while( len!=-1 )
{
fos.write(buffer, 0, len);
len=sis.readLine(buffer, 0, 1024);
}
fos.close();
sis.close();
}
第二步:實現如下圖1的的表單頁面,生成一個注冊表單,提交到Servlet中
詳細的代碼如下:
<form action="servlet/ReceiveFile" method="post" enctype="multipart/form-data">
第一個參數<input type="text" name="name1"/> <br/>
第二個參數<input type="text" name="name2"/> <br/>
第一個上傳的文件<input type="file" name="file1"/> <br/>
第二個上傳的文件<input type="file" name="file2"/> <br/>
<input type="submit" value="提交">
</form>
注意了,由於要上傳附件,所以一定要設置enctype為multipart/form-data,才可以實現附件的上傳。
第三步:填寫完信息後按「提交」按鈕後,在D盤下查找file.log文件用記事本打開,數據如下:
-----------------------------7d92221b604bc
Content-Disposition: form-data; name="name1"
hello
-----------------------------7d92221b604bc
Content-Disposition: form-data; name="name2"
world
-----------------------------7d92221b604bc
Content-Disposition: form-data; name="file1"; filename="C:/2.GIF"
Content-Type: image/gif
GIF89a
Ⅳ http方式上傳數據Post時,對數據有什麼格式要求嗎
Http之Get/Post請求區別
1.HTTP請求格式:
<request line>
<headers>
<blank line>
[<request-body>]
在HTTP請求中,第一行必須是一個請求行(request line),用來說明請求類型、要訪問的資源以及使用的HTTP版本。緊接著是一個首部(header)小節,用來說明伺服器要使用的附加信息。在首部之後是一個空行,再此之後可以添加任意的其他數據[稱之為主體(body)]。
1. get是從伺服器上獲取數據,post是向伺服器傳送數據。
get 和 post只是一種傳遞數據的方式,get也可以把數據傳到伺服器,他們的本質都是發送請求和接收結果。只是組織格式和數據量上面有差別,http協議裡面有介紹
2. get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個欄位一一對應,在URL中可以看到。post是通過HTTP post機制,將表單內各個欄位與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。
因為get設計成傳輸小數據,而且最好是不修改伺服器的數據,所以瀏覽器一般都在地址欄裡面可以看到,但post一般都用來傳遞大數據,或比較隱私的數據,所以在地址欄看不到,能不能看到不是協議規定,是瀏覽器規定的。
3. 對於get方式,伺服器端用Request.QueryString獲取變數的值,對於post方式,伺服器端用Request.Form獲取提交的數據。
沒明白,怎麼獲得變數和你的伺服器有關,和get或post無關,伺服器都對這些請求做了封裝
4. get傳送的數據量較小,不能大於2KB。post傳送的數據量較大,一般被默認為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB。
post基本沒有限制,我想大家都上傳過文件,都是用post方式的。只不過要修改form裡面的那個type參數
5. get安全性非常低,post安全性較高。
如果沒有加密,他們安全級別都是一樣的,隨便一個監聽器都可以把所有的數據監聽到,不信你自己下一個監聽網路資源的軟體,
Get是向伺服器發索取數據的一種請求,而Post是向伺服器提交數據的一種請求,在FORM(表單)中,Method默認為"GET",實質上,GET和POST只是發送機制不同,並不是一個取一個發!
Http定義了與伺服器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用於描述一個網路上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個資源的查,改,增,刪4個操作。到這里,大家應該有個大概的了解了,GET一般用於獲取/查詢資源信息,而POST一般用於更新資源信息。
1.根據HTTP規范,GET用於信息獲取,而且應該是安全的和冪等的。
(1).所謂安全的意味著該操作用於獲取信息而非修改信息。換句話說,GET 請求一般不應產生副作用。就是說,它僅僅是獲取資源信息,就像資料庫查詢一樣,不會修改,增加數據,不會影響資源的狀態。
Ⅵ HTTP 的 POST 參數提交和上傳的不同與 Mojolicious 的實現
對於 HTTP 協議, 我們在使用 POST 上傳的時候, 其實是有好幾種不同的處理方式的, 所以對於客戶端和伺服器端, 也分別都有不同的處理. 正常普通的網頁在提交參數上傳到伺服器的時候, 主要會根據內容的不同來使用不同的處理. 所體現在不同的地方在 Content-Type 的類型.
比如我們常常用 Mojolicious 處理這類接收到的參數和內容的時候, 會讓很多人暈掉, 所以我在這, 基於協議的頭, 來給大家介紹一下在參數和上傳的時候有什麼不同.
客戶端, 比如瀏覽器網頁中的 form 的表格的參數的不同, 客戶端比如 Linux 命令行的 curl 的參數的不同和程序介面提交參數的不同, HTTP 協議在上傳的時候, 大約會有三種不同, 這些體現在 Content-Type 的三種類型:
application/x-www-form-urlencoded
multipart/form-data
post 的 body 的內容
下面我們來詳細介紹
1. application/x-www-form-urlencoded 默認
瀏覽器: 在 HTML 中 form 有個參數是 enctype 屬性用於指定編碼方式, 常用有前面講的兩種: application/x-www-form-urlencoded 和 multipart/form-data. 但默認的時候, 我們並不指定. 不指定的時候, 默認是 "application/x-www-form-urlencoded" , 所以其實, 我們平時都是使用的這種格式來提交數據. 因為是默認就不寫出來了. 注意, 這個會對空格和特別的符號進行 url 的 encode.
程序: 我們現在以 Mojo::UserAgent 這個模塊為例子, 我們提交一個參數 args 值為 test.
$ua->post('ht tp:/ /w ww.php-oa.co m/a/b' => form => { args => 'test'});
命令:
$curl -svo /dev/null -d "args=test" htt p:/ /w ww.php-oa.co m/a/b
HTTP 協議狀態
這個時候所發送的 HTTP 的頭和內容分別如下. body 中會存著參數, 會有一個特別的 Header.
-- Blocking request (ht tp:/ /w ww.php-oa.co m/a/b)
-- Connect (ht tp:ww w.php-oa.c om:80)
-- Client >>> Server (htt p://w ww.php-oa.c om/a/b)
POST /a/b HTTP/1.1
User-Agent: Mojolicious (Perl)
Connection: keep-alive
Content-Type: application/x-ww w-form-urlencoded
Accept-Encoding: gzip
Content-Length: 9
Host: www.php-oa.com
args=test
服務端接收方式
這個時候, 伺服器會根據因為是 POST 的方法, 並且頭部的 Content-Type: application/x-www-form-urlencoded 會去解析 body 的參數. 這樣在 Mojolicious 伺服器
post '/a/b' => sub {
my $self = shift;
my $foo = $self->param('args');
$self->render(text => "Hello from $foo.");
}
2. multipart/form-data 大文件, 媒體文件
對於比較大的, 有一些二進制數據和象視頻文件之類大文件, 建議使用這種方式上傳.
瀏覽器:
普通的 HTTP 的寫法如果要使用 enctype 的話, 只要象下面一樣就行.
<form action="/path/to/login" enctype="multipart/form-data">
<input disabled="disabled" name="first_name" type="text" />
<input value="Ok" type="submit" />
</form>
客戶端:
在 Mojo::UserAgent 考慮得非常周全, 當你提交的內容中包含二進制文件之類時, 就會自動幫你轉換成 "multipart/form-data" 格式提交. 這個格式會生成一個隨機字元來分割不同參數. 區分是否使用這種格式主要是, 當你提交的參數中, 又是一個引用, 並且引中可以使用 content 來指定內容或者 file 來指定路徑.
$ua->post('htt p:/ /w ww.php-oa.c om/a/b' => form => { args => 'test', args_file => { file => '/root/.bash_history' } });
# or
$ua->post('ht tp://w ww.php-oa.c om/a/b' => form => { args => 'test', args_file => { content => 'test' } });
HTTP 協議狀態
這個地方我們可以見到 Content-Type: multipart/form-data 的請求頭, 告訴文件和參數是這種格式上傳過來的.並且 boundary 用於指定一個參數之間的分割符.
-- Blocking request (ht tp://w ww.php-oa.c om/a/b)
-- Connect (ht tp:w ww.php-oa.co m:80)
-- Client >>> Server (ht p://ww w.php-oa.co m/a/b)
POST /a/b HTTP/1.1
User-Agent: Mojolicious (Perl)
Content-Type: multipart/form-data; boundary=WRoHX
Connection: keep-alive
Accept-Encoding: gzip
Content-Length: 14428
Host: www.php-oa.com
--WRoHX
Content-Disposition: form-data; name="args"
test
--WRoHX
Content-Disposition: form-data; name="args_file"; filename=".bash_history"
........文件本身
伺服器接收方式
在後端的伺服器接收的時候 Mojolicious 想得非常周到. 對於這種格式能自動解析, 並且全程非同步.不會多佔內存. 這個會自動給大的文件使用一個叫 Mojo::Upload 的對象來處理, 我們可以通過 $self->req->upload('args_file'); 這個方法取得這個內容的對象, 這個內容的對象是Mojo::Asset::File 這個對象, 存文件和取大文件之類可以直接調用.
post '/a/b' => sub {
my $self = shift;
my $upload = $self->req->upload('args_file');
my $foo = $self->param('args');
$self->render(text => "Hello from $foo.");
}
3. POST 的 body 的內容
最後一種, 是有時我們做大文件上傳, 和提交內容之類.這個時候, 整個 body 都是文件本體. 參數象 get 一樣通過 url 傳過去.
這個就不用抓頭了, 沒任何轉換, 直接整個 body 是個大文件.
客戶端提交:
我們來看看客戶端在這個時候怎麼上傳送. 同樣, 我們使用 Mojo::UserAgent 為例子.
my $ua = Mojo::UserAgent->new;
$ua->transactor->add_generator(stream => sub {
my ($transactor, $tx, $path) = @_;
$tx->req->content->asset(Mojo::Asset::File->new(path => $path));
});
$ua->post('ht tp://w ww.php-oa.co m/a/b' => stream => '/root/.bash_history' );
伺服器接收
這個時候, 在伺服器端怎麼接收啦?
post '/a/b' => sub {
my $self = shift;
my $body = $self->req->body;
my $foo = $self->param('args');
$self->render(text => "Hello from $foo.");
}
這個, 我們直接取請求的 body 就可以了, 但這有個小問題, 這是這個文件上傳完, 這個 body 會存著所有的文件, 比如這個上傳的文件有 1G , 這個 1G 就都會占著內存. 這個情況, Mojolicious 並沒有實現事件來根據塊取文件. 晚點, 我有個有於大文件上傳的文章, 會分享我在 Mojolicious 中實現非同步以塊方式存儲文件. 這樣用戶上傳多少, 我存多少, 並不會佔用更多的內存.
好了整個三種方式都介紹完了, 大家一定注意區分哦 .
Ⅶ 如何用POST方法上傳文件
POST方法上傳文件 隨著PHP不斷的完善,PHP對文件上傳的支持也越來越完美,在PHP 4.0.3以前我們只能用() 和 is_uploaded_file()方法結合來上傳文件,呵呵,其實就是這樣我們也會感覺到PHP相對於ASP來說上傳文件要方便很多,這也就是本人選擇PHP的一點小小的引以為豪的地方。PHP 4.0.3之後PHP又出了一個新函數move_uploaded_file()。上傳文件相對來說又簡便了不少,只要這一個函數就行(我可不是說上傳文件系統只要就一個函數就足夠了,大家可不要誤解我的意思,我的意思是move_uploaded_file是上傳文件的一個核心函數)。 好了,我們看一個三個函數的講解(資料來自:PHP手冊)。 (string source,string desk); 將文件從 source 拷貝到 dest。如果成功則返回 TRUE,失敗則返回 FALSE。 例: if (!($file, $file.'.bak')) { print ("failed to $file...<br>\n"); } is_uploaded_file(string filename) 如果 filename 所給出的文件是通過 HTTP POST 上傳的則返回 TRUE。 move_uploaded_file(string filename, string destination) 本函數檢查並確保由 filename 指定的文件是合法的上傳文件(即通過 PHP 的 HTTP POST 上傳機制所上傳的)。如果文件合法,則將其移動為由 destination 指定的文件。 由三個函數的解釋就可以得到一個結論,move_uploaded_file()是()和is_uploaded_file()函數的結合 講了這么半天大家用起這三個函數可能還會有些生疏,下面給大家兩個例子: 首先,建立一個前台頁面,命名為index.html Code代碼如下: <form enctype="multipart/form-data" action="_URL_" method="post"> Send this file: <input name="filename" type="file"> <input type="submit" value="Send File"> </form> 1,下面是關於()和is_uploaded_file()方法上傳文件的方法(保存為:.php,上傳文件需要將index.html中的_URL_改為.php) Code代碼如下: <?php $path="./uploadfiles/"; if(is_uploaded_file($filename)) //特別注意這里,傳遞給is_uploaded_file的為$filename,可不要傳遞$_FILES["filename"]["name"] { $file1=$_FILES["filename"]["name"]; //注意這里$_FILES[]方法為PHP4.1.0及以上版本支持,PHP以下的版本要用$HTTP_POST_FILES[]方法 $file2=$path.time().$file1; $flag=1; } if($flag) $result=($_FILES['filename']['tmp_name'],$file2); if($result) echo "上傳成功!"; ?> 2,下面是關於move_uploaded_file()方法上傳文件的方法(保存為:move.php,上傳文件需要將index.html中的_URL_改為move.php) Code代碼如下: <?php $path="./uploadfiles/"; if($_FILES["filename"]["name"]){ $file1=$_FILES["filename"]["name"]; $file2 = $path.time().$file1; $flag=1; } if($flag) $result=move_uploaded_file($_FILES["filename"]["tmp_name"],$file2); //特別注意這里傳遞給move_uploaded_file的第一個參數為上傳到伺服器上的臨時文件 if($result) echo "上傳成功!"; ?> 文件上傳就講到這里了,這只是兩個小程序,其實要完成文件上傳所要的代碼可不是這些就能了事的。一般還要有文件大小限制,文件擴展名選取,還有一些其它的安全方案。
Ⅷ HTTPclient使用MultipartEntity怎麼上傳文件
你先搞清楚 HTTPclient 是做什麼用的
HTTPclient 的作用是在 jsp 中模擬一個瀏覽器,即 HTTP 協議的客戶端(client)
你的後台代碼是將你本地伺服器上的文件像瀏覽器那樣上傳到目標伺服器
於是 new File("C:\\1.txt") 的問題就可以解決了吧?C:\\1.txt 是你本地伺服器中的文件,當然文件名是你自己定的
至於 multipart/form-data 聲明,那是由 HttpPost 的參數 MultipartEntity 自動加上的
Ⅸ 怎麼用C實現Http POST功能向Http伺服器上傳文件
用socket就行了。
和伺服器建立請求。
然後發送請求報文"\r\n\r\n"結束之後是數據。
post分為,application/x-www-form-urlencoded和multipart/form-data boundary=
要是上傳文件,就得使用multipart/form-data boundary=...
伺服器那邊根據boundary來解析出數據。
Ⅹ 怎麼用http上傳一個文件到伺服器 python
首先,標准HTTP協議對上傳文件等表單的定義在這里:wwwietforg/rfc/rfc1867txt 大概數據包格式如下:
單文件:
Content-type: multipart/form-data, boundary=AaB03x
--AaB03x
content-disposition: form-data; name="field1"
Joe Blow
--AaB03x
content-disposition: form-data; name="pics"; filename="file1.txt"
Content-Type: text/plain
... contents of file1.txt ...
--AaB03x--
多文件:
Content-type: multipart/form-data, boundary=AaB03x
--AaB03x
content-disposition: form-data; name="field1"
Joe Blow
--AaB03x
content-disposition: form-data; name="pics"
Content-type: multipart/mixed, boundary=BbC04y
--BbC04y
Content-disposition: attachment; filename="file1.txt"
其次,python上傳文件的幾種方法:
1 自己封裝HTTP的POST數據包:http//stackoverflowcom/questions/680305/using-multipartposthandler-to-post-form-data-with-python
import httplibimport mimetypesdef post_multipart(host, selector, fields, files): content_type, body = encode_multipart_formdata(fields, files) h = httplib.HTTP(host) h.putrequest('POST', selector) h.putheader('content-type', content_type) h.putheader('content-length', str(len(body))) h.endheaders() h.send(body) errcode, errmsg, headers = h.getreply() return h.file.read() def encode_multipart_formdata(fields, files): LIMIT = '----------lImIt_of_THE_fIle_eW_$' CRLF = '\r\n' L = [] for (key, value) in fields: L.append('--' + LIMIT) L.append('Content-Disposition: form-data; name="%s"' % key) L.append('') L.append(value) for (key, filename, value) in files: