最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于java文件上傳-原始的Servlet方式

 更新時間:2017年08月07日 08:40:13   投稿:jingxian  
下面小編就為大家?guī)硪黄趈ava文件上傳-原始的Servlet方式。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言:干了這幾個項目,也做過幾次文件上傳下載,要么是copy項目以前的代碼,要么是百度的,雖然做出來了,但學(xué)習(xí)一下原理弄透徹還是很有必要的。剛出去轉(zhuǎn)了一圈看周圍有沒有租房的,在北京出去找房子是心里感覺最不爽的時候,沒有歸屬感,房租還不便宜,RT,不能好高騖遠,還是腳踏實地一點一點學(xué)技術(shù)吧,終將有一日,工資會漲的。

java文件上傳

傳統(tǒng)的文件上傳,不用jquery插件的話,就是用form表單提交,項目里用過uploadify,可以異步上傳文件,原理我也沒研究?,F(xiàn)在說傳統(tǒng)的form表單上傳文件。

文件上傳核心:

用<input type=”file”/> 來聲明一個文件域。樣式如 文件:_____ <瀏覽>.

必須使用post方式提交表單。

必須設(shè)置表單的類型為multipart/form-data.是設(shè)置這個表單傳遞的不是key=value值。傳遞的是字節(jié)碼.

新建web項目:

jsp form表單:enctype(編碼類型)的默認值就是 application/x-www-form-urlencoded

瀏覽器查看 http報文:主要參數(shù):Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 接收服務(wù)器返回的類型,*/*表示所有。Referer:http://localhost:8888/upload/ 來自哪個網(wǎng)站Accept-Language:zh-CN,zh;q=0.8 :請求回應(yīng)中首選的語言為簡體中文Accept-Encoding:gzip, deflate, br支持的壓縮格式User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 用戶瀏覽器類型Host:localhost:8888 主機地址Connection:keep-alive 報文發(fā)送完畢后仍然保持連接Cache-Contrp: max-age=0 緩存Content-Length: 41 41字節(jié)對文件上傳來說,重要的參數(shù)是:Content-Type: application/x-www-form-urlencoded這個參數(shù)只有post請求才有,默認就是application/x-www-from-urlencoded ,Content-type表示正文類型,get方式?jīng)]有正文,因為參數(shù)在url里。在Servlet里可以用request對象取到Content-type:request.getHeader("Content-type"); 默認的值為 application/x-www-form-urlencoded,如果是get請求,則 request.getHeader("Content-type");為null。下圖是get請求時的http頭信息:  

文件上傳,必須設(shè)置enctype="multipart/form-data"
from表單:上傳一個word:此時的http消息: Content-Type:multipart/form-data; boundary=----WebKitFormBou ndarywYwQ3v1NemO0bPfM 。
其中的 boundary=----WebKitFormBoundary44gVxAkoSg3tk3oR 指的是文件上傳的分隔符。
看請求的報文: boundry=xxxxx 標識文件開始,也有文件頭,說的是上傳的數(shù)據(jù)的類型,第一個input 是text類型,第二個是二進制,content-type 是application/octet-stream 表示 二進制流。上傳圖片,Content-Type: image/jpeg,上傳文本,Content-Type: text/plain。 二進制流的接收:當表單類型是post類型,切enctype="multipart/form-data",則所有的數(shù)據(jù)都是以二進制流的形式向服務(wù)器上傳,所以request.getParameter("xxx") 永遠為null,只能通過req.getInputStream(); 獲取正文。上傳一個txt:Servlet:

package com.lhy.upload;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 
 * @author Administrator
 *
 */
@WebServlet(name="UploadServlet",urlPatterns="/UploadServlet")
public class UploadServlet extends HttpServlet{

 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
//  this.doPost(req, resp);
 }

 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  
  req.setCharacterEncoding("UTF-8");
  String contentType = req.getHeader("Content-type");
  System.out.println("contentType: "+contentType);
  String name = req.getParameter("name");
  System.out.println(name);//null
  
  InputStream is = req.getInputStream();
  
  
//  ------WebKitFormBoundaryG0ULv7eVfQ1K2PBA
//  Content-Disposition: form-data; name="image"; filename="靜夜思.txt"
//  Content-Type: text/plain
//
//
//  ------WebKitFormBoundaryG0ULv7eVfQ1K2PBA--
  BufferedReader br = new BufferedReader(new InputStreamReader(is));
  String firstLine = br.readLine();//第一行,分隔符
  String fileName = br.readLine();
//  Content-Disposition: form-data; name="image"; filename="jingyesi.txt"
  fileName = fileName.substring(fileName.lastIndexOf("=")+2,fileName.length()-1);
  
  br.readLine();
  br.readLine();
  String data = null;
  //獲取當前項目的運行路徑
  String path = getServletContext().getRealPath("/up");
  PrintWriter pw = new PrintWriter(path+"/"+fileName);
  while((data = br.readLine()) != null){
   if(data.equals(firstLine+"--")){
    break ; //讀到了文件尾
   }
   pw.println(data);
  }
  pw.flush();
  pw.close();
  is.close();

  
  /* FileOutputStream fos = new FileOutputStream(path+"/"+"b.doc");
//  byte[] b = new byte[1024];
  int len = 0;
  while((len = is.read()) != -1){
   fos.write(len);
  }
  fos.flush();
  fos.close();
  is.close();*/
 }

 
}

項目里:

例子只是讀取了txt,其他的二進制需要使用inputStream讀取。

以上這篇基于java文件上傳-原始的Servlet方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring?Boot如何利用攔截器加緩存完成接口防刷操作

    Spring?Boot如何利用攔截器加緩存完成接口防刷操作

    流的需求出現(xiàn)在許多常見的場景中,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot如何利用攔截器加緩存完成接口防刷操作的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • 詳解Java多線程編程中互斥鎖ReentrantLock類的用法

    詳解Java多線程編程中互斥鎖ReentrantLock類的用法

    Java多線程并發(fā)的程序中使用互斥鎖有synchronized和ReentrantLock兩種方式,這里我們來詳解Java多線程編程中互斥鎖ReentrantLock類的用法:
    2016-07-07
  • 使用jpa的實體對象轉(zhuǎn)json符串時懶加載的問題及解決

    使用jpa的實體對象轉(zhuǎn)json符串時懶加載的問題及解決

    這篇文章主要介紹了使用jpa的實體對象轉(zhuǎn)json符串時懶加載的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java中方法重寫與重載的區(qū)別

    Java中方法重寫與重載的區(qū)別

    大家好,本篇文章主要講的是Java中方法重寫與重載的區(qū)別,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Java并發(fā)編程中的synchronized關(guān)鍵字詳細解讀

    Java并發(fā)編程中的synchronized關(guān)鍵字詳細解讀

    這篇文章主要介紹了Java并發(fā)編程中的synchronized關(guān)鍵字詳細解讀,在Java早期版本中,synchronized 屬于 重量級鎖,效率低下,這是因為監(jiān)視器鎖(monitor)是依賴于底層的操作系統(tǒng)的Mutex Lock來實現(xiàn)的,Java 的線程是映射到操作系統(tǒng)的原生線程之上的,需要的朋友可以參考下
    2023-12-12
  • 客戶端設(shè)置超時時間真的很重要

    客戶端設(shè)置超時時間真的很重要

    今天小編就為大家分享一篇關(guān)于客戶端設(shè)置超時時間真的很重要,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • android中GridView的用法示例

    android中GridView的用法示例

    這篇文章主要介紹了android中GridView的用法,對于Android初學(xué)者很有參考學(xué)習(xí)價值,需要的朋友可以參考下
    2014-08-08
  • 分布式服務(wù)Dubbo+Zookeeper安全認證實例

    分布式服務(wù)Dubbo+Zookeeper安全認證實例

    下面小編就為大家分享一篇分布式服務(wù)Dubbo+Zookeeper安全認證實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Java單例模式的知識點詳解

    Java單例模式的知識點詳解

    在本篇文章里小編給大家整理的是關(guān)于Java單例模式的知識點詳解,有興趣的朋友們可以學(xué)習(xí)參考下。
    2020-02-02
  • Java復(fù)習(xí)之集合框架總結(jié)

    Java復(fù)習(xí)之集合框架總結(jié)

    本篇文章主要介紹了Java復(fù)習(xí)之集合框架總結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09

最新評論

吉安县| 和平区| 和平区| 观塘区| 廉江市| 梓潼县| 涡阳县| 调兵山市| 大港区| 淮安市| 望谟县| 阿荣旗| 冷水江市| 青神县| 平山县| 通化县| 紫金县| 曲麻莱县| 旌德县| 漳州市| 韶山市| 重庆市| 南投县| 中宁县| 松桃| 延庆县| 灵武市| 奉节县| 武定县| 聂荣县| 阳信县| 当涂县| 江油市| 建瓯市| 泽普县| 高雄县| 顺昌县| 洛隆县| 静乐县| 重庆市| 民丰县|