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

淺談圖片上傳利用request.getInputStream()獲取文件流時遇到的問題

 更新時間:2017年11月10日 09:47:27   作者:晴朗依舊  
下面小編就為大家?guī)硪黄獪\談圖片上傳利用request.getInputStream()獲取文件流時遇到的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

圖片上傳功能是我們web里面經(jīng)常用到的,獲得的方式也有很多種,這里我用的是request.getInputStream()獲取文件流的方式。想要獲取文件流有兩種方式,附上代碼

int length = request.getContentLength();//獲取請求參數(shù)長度。
byte[] bytes = new byte[length];//定義數(shù)組,長度為請求參數(shù)的長度
DataInputStream dis = new DataInputStream(request.getInputStream);//獲取請求內(nèi)容,轉(zhuǎn)成數(shù)據(jù)輸入流
int readcount = 0;//定義輸入流讀取數(shù)
while(readcount < length){
 int aa= dis.read(bytes,readcount,length); //讀取輸入流,放入bytes數(shù)組,返回每次讀取的數(shù)量
 readcount = aa + readcount; //下一次的讀取開始從readcount開始
}
//讀完之后bytes就是輸入流的字節(jié)數(shù)組,將其轉(zhuǎn)為字符串就能看到
String bb = new String(bytes,"UTF-8");

上面這種是利用讀取輸入流的方式,也可以用寫入字節(jié)輸入流的方式獲取,就不需要獲取請求長度了

DataInputStream dis = new DataInputStream(request.getInputStream());
ByteArrayOutputStream baot = new ByteArrayOutputStream();
byte[] bytes = new byte[1024]; //定義一個數(shù)組 用來讀取
int n = 0;//每次讀取輸入流的量
while((n=dis.read(bytes))!=-1){
 baot.write(bytes); //將讀取的字節(jié)流寫入字節(jié)輸出流 
}
byte[] outbyte = boat.toByteArray();//將字節(jié)輸出流轉(zhuǎn)為自己數(shù)組。
String bb = new String(outbyte,"UTF-8");

這兩種方式都能獲取傳輸?shù)膬?nèi)容,但有兩點一定要注意一下,最開始在獲取的時候只能獲取到文件的名字卻沒有文件的內(nèi)容,這里附上測試用的前端代碼:

上網(wǎng)查了一下,有的人是input標(biāo)簽里面沒有name屬性會導(dǎo)致這個問題,但是我并不是沒有name標(biāo)簽。繼續(xù)查是這樣的:

所以我覺得肯定是缺少了發(fā)送類型所以在form標(biāo)簽中加入了enctype='multipart/form-data',果然可以獲取內(nèi)容了。

然后就是第二個問題,也是我們通過request.getInputStream()方法獲取文件的話,獲取的內(nèi)容不只是只有文件的,即使你表單中只有一個file標(biāo)簽。剛開始我就是犯了這個錯誤,用拿到的byte數(shù)組直接輸入或者轉(zhuǎn)成文件都是顯示不出來,后來才意識到,拿到了inputStream的bytes還要把文件的內(nèi)容從中剝離出來才可以。這里提供一個方法,具體實現(xiàn)過程還沒有細(xì)研究,先附上之后再細(xì)看

/**
  * 取得圖片數(shù)據(jù)
  *
  * @param requestData
  * @param contentType
  * @return
  * @throws IOException
  */
 private byte[] getImgData(byte[] requestData, String contentType)
   throws IOException {
  String txtBody = new String(requestData, "GBK");
  if (!txtBody.contains("image/jpg") && !txtBody.contains("image/jpeg")&& !txtBody.contains("jpg")) {
   return null;
  }
  String boundarytext = contentType.substring(
    contentType.lastIndexOf("=") + 1, contentType.length());
  // 取得實際上傳文件的起始與結(jié)束位置
  int pos = txtBody.indexOf("filename=\"");
  pos = txtBody.indexOf("\n", pos) + 1;
  pos = txtBody.indexOf("\n", pos) + 1;
  pos = txtBody.indexOf("\n", pos) + 1;
  // 文件描述信息后就文件內(nèi)容,直到為文件邊界為止,從pos開始找邊界
  int boundaryLoc = txtBody.indexOf(boundarytext, pos) - 4;
  ByteArrayOutputStream realdatas = null;
  try {
   int begin = ((txtBody.substring(0, pos)).getBytes("GBK")).length;
   int end = ((txtBody.substring(begin, boundaryLoc)).getBytes("GBK")).length;
   realdatas = new ByteArrayOutputStream();
   realdatas.write(requestData, begin, end); 
   return realdatas.toByteArray();
  } finally {
   if (null != realdatas) {
    try {
     realdatas.close();
    } catch (IOException e) {
     logger.error("處理上傳圖片數(shù)據(jù)錯誤:", e);
    }
   }
  }
 }

這里的參數(shù)就是請求的內(nèi)容數(shù)組bytes以及請求類型,類型的話我們可以通過request.getContentType()方法直接獲取,返回值同樣是byte數(shù)組,返回的byte數(shù)組就是我們上傳圖片的內(nèi)容了。

返回前端的話,直接利用response就可以。

OutputStream os = response.getOutputStream();
os.write(bytes);

以上這篇淺談圖片上傳利用request.getInputStream()獲取文件流時遇到的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java基礎(chǔ)知識之StringReader流的使用

    Java基礎(chǔ)知識之StringReader流的使用

    這篇文章主要介紹了Java基礎(chǔ)知識之StringReader流的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java枚舉與注解的創(chuàng)建步驟

    Java枚舉與注解的創(chuàng)建步驟

    這篇文章通過抽象的概念和具體實現(xiàn)步驟,充分說明了java枚舉與注解的概念和使用方法,通過該篇文章你可以學(xué)會如何自定義枚舉類和了解部分Java內(nèi)置注解,希望對你有所幫助
    2021-06-06
  • java.lang.StackOverflowError出現(xiàn)的原因及解決

    java.lang.StackOverflowError出現(xiàn)的原因及解決

    這篇文章主要介紹了java.lang.StackOverflowError出現(xiàn)的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Spring注入Map集合實現(xiàn)策略模式詳解

    Spring注入Map集合實現(xiàn)策略模式詳解

    這篇文章主要介紹了Spring注入Map集合實現(xiàn)策略模式詳解,Spring提供通過@Resource注解將相同類型的對象注入到Map集合,并將對象的名字作為key,對象作為value封裝進入Map,需要的朋友可以參考下
    2023-11-11
  • spring系列筆記之常用注解

    spring系列筆記之常用注解

    這篇文章主要給大家介紹了關(guān)于spring系列筆記之常用注解的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SpringBoot實現(xiàn)短信發(fā)送及手機驗證碼登錄

    SpringBoot實現(xiàn)短信發(fā)送及手機驗證碼登錄

    本文主要介紹了SpringBoot實現(xiàn)短信發(fā)送及手機驗證碼登錄,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • JAVA實現(xiàn)紅包分發(fā)的示例代碼

    JAVA實現(xiàn)紅包分發(fā)的示例代碼

    這篇文章主要介紹了JAVA實現(xiàn)紅包分發(fā)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • SpringBoot與Spring之間的對比

    SpringBoot與Spring之間的對比

    這篇文章主要介紹了SpringBoot與Spring之間的對比,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 解決spring jpa中update的坑

    解決spring jpa中update的坑

    這篇文章主要介紹了spring jpa中update遇到的坑及解決方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • springboot2自動加載sql文件的實現(xiàn)

    springboot2自動加載sql文件的實現(xiàn)

    本文主要介紹了springboot2自動加載sql文件的實現(xiàn),通過配置文件或注解的方式,我們可以輕松地將SQL語句映射到數(shù)據(jù)庫中,實現(xiàn)自動加載,感興趣的可以了解一下
    2023-11-11

最新評論

平遥县| 大同县| 元氏县| 洛宁县| 夹江县| 涟源市| 安徽省| 湖口县| 永康市| 英超| 都兰县| 金平| 且末县| 石泉县| 宣威市| 万载县| 法库县| 宝鸡市| 自贡市| 凤台县| 洱源县| 枞阳县| 镇雄县| 淳安县| 九龙坡区| 明水县| 龙胜| 凌云县| 静海县| 海南省| 信丰县| 墨竹工卡县| 顺昌县| 桃园市| 长垣县| 道孚县| 阿坝| 大同县| 金坛市| 宜黄县| 宁明县|