熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java利用HttpURLConnection發送post請求上傳文件

2013-11-23 19:34:34  來源: Java核心技術 

  在頁面裡實現上傳文件不是什麼難事寫個form加上enctype = multipart/formdata在寫個接收的就可以了沒什麼難的如果要用HttpURLConnection來實現文件上傳還真有點搞頭:)

  先寫個servlet把接收到的 HTTP 信息保存在一個文件中 看一下 form 表單到底封裝了什麼樣的信息

  Java代碼

  public void doPost(HttpServletRequest request HttpServletResponse response)

  throws ServletException IOException {

  //獲取輸入流是HTTP協議中的實體內容

  ServletInputStream  in=requestgetInputStream();

  //緩沖區

  byte buffer[]=new byte[];

  FileOutputStream out=new FileOutputStream(d:\\testlog);

  int len=sisread(buffer );

  //把流裡的信息循環讀入到filelog文件中

  while( len!= ){

  outwrite(buffer len);

  len=inreadLine(buffer );

  }

  outclose();

  inclose();

  }

  來一個form表單

  <form name=upform action=uploaddo method=POST

  enctype=multipart/formdata>

  參數<input type=text name=username/><br/>

  文件<input type=file name=file/><br/>

  文件<input type=file name=file/><br/>

  <input type=submit value=Submit />

  <br />

  </form>

  假如我參數寫的內容是hello word然後二個文件是二個簡單的txt文件上傳後testlog裡如下

  Java代碼

  daec

  ContentDisposition: formdata; name=username

  hello word

  daec

  ContentDisposition: formdata; name=file; filename=D:\hahatxt

  ContentType: text/plain

  haha

  hahaha

  daec

  ContentDisposition: formdata; name=file; filename=D:\huhutxt

  ContentType: text/plain

  messi

  huhu

  daec

  研究下規律發現有如下幾點特征

  第一行是 dbbc 作為分隔符然後是 \r\n 回車換行符 這個dbbc 分隔符浏覽器是隨機生成的

  第二行是ContentDisposition: formdata; name=file; filename=D:\huhutxt;name=對應input的name值filename對應要上傳的文件名(包括路徑在內)

  第三行如果是文件就有ContentType: text/plain這裡上傳的是txt文件所以是text/plain如果上穿的是jpg圖片的話就是image/jpg了可以自己試試看看

  然後就是回車換行符

  在下就是文件或參數的內容或值了hello word

  最後一行是daec注意最後多了二個;

  有了這些就可以使用HttpURLConnection來實現上傳文件功能了

  Java代碼 public void upload(){

  List<String> list  = new ArrayList<String>();  //要上傳的文件名d:\hahadoc你要實現自己的業務我這裡就是一個空list

  try {

  String BOUNDARY = dadc; // 定義數據分隔線

  URL url = new URL();

  HttpURLConnection conn = (HttpURLConnection) urlopenConnection();

  // 發送POST請求必須設置如下兩行

  connsetDoOutput(true);

  connsetDoInput(true);

  connsetUseCaches(false);

  connsetRequestMethod(POST);

  connsetRequestProperty(connection KeepAlive);

  connsetRequestProperty(useragent Mozilla/ (compatible; MSIE ; Windows NT ; SV));

  connsetRequestProperty(Charsert UTF);

  connsetRequestProperty(ContentType multipart/formdata; boundary= + BOUNDARY);

  OutputStream out = new DataOutputStream(conngetOutputStream());

  byte[] end_data = (\r\n + BOUNDARY + \r\n)getBytes();// 定義最後數據分隔線

  int leng = listsize();

  for(int i=;i<leng;i++){

  String fname = listget(i);

  File file = new File(fname);

  StringBuilder sb = new StringBuilder();

  sbappend();

  sbappend(BOUNDARY);

  sbappend(\r\n);

  sbappend(ContentDisposition: formdata;name=\file+i+\;filename=\+ filegetName() + \\r\n);

  sbappend(ContentType:application/octetstream\r\n\r\n);

  byte[] data = sbtoString()getBytes();

  outwrite(data);

  DataInputStream in = new DataInputStream(new FileInputStream(file));

  int bytes = ;

  byte[] bufferOut = new byte[];

  while ((bytes = inread(bufferOut)) != ) {

  outwrite(bufferOut bytes);

  }

  outwrite(\r\ngetBytes()); //多個文件時二個文件之間加入這個

  inclose();

  }

  outwrite(end_data);

  outflush();

  outclose();

  // 定義BufferedReader輸入流來讀取URL的響應

  BufferedReader reader = new BufferedReader(new InputStreamReader(conngetInputStream()));

  String line = null;

  while ((line = readerreadLine()) != null) {

  Systemoutprintln(line);

  }

  } catch (Exception e) {

  Systemoutprintln(發送POST請求出現異常! + e);

  eprintStackTrace();

  }

  }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27114.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.