java前端接收回顯圖片_圖片上傳并回顯后端篇

圖片上傳并回顯后端篇

我們先看一下效果

1a14d189a2d7ebf43228fb5e75243490.gif

繼上一篇的圖片上傳和回顯,我們來實戰一下圖片上傳的整個過程,今天我們將打通前后端,我們來真實的了解一下,我們上傳的文件,是以什么樣的形式上傳到服務器,難道也是一張圖片?等下我們來揭曉

我們在實戰開始前呢,我們先做一下準備工作,比如新建一個java web工程,如果你不懂這個的話,那我建議你先學一下Javaweb,可以去我的公眾號找一下這方面的教程。我們就給我們的工程起名為UpImg,我們再給他建一個web包和util包,再把我們以前前端做的圖片回顯的代碼拷到工程里,我們來看一下項目

6f740198488aa7cc52a076959d95aa4f.png

我們發布一下項目來看一下

1cb6441d46b7401d661025cd2d02aecb.png

這樣的話,我們基本的框架就做好了,我們今天就先用form表單來實戰一下圖片的上傳,下一期我們就通過ajax來實現異步圖片上傳,我們先給我們的前端代碼加點料

這個樣式我就不再美化了,我們來看一下效果

324c23d5a6a7318c395ba3540d721ca3.png

這樣的話,我們前端基本就完成了,我來講解一下部分代碼吧;表單的enctype屬性:

1、默認屬性:application/x-www-form-urlencoded,只處理表單域中的value屬性值,采用這種編碼的方式的表單會將表單域的值處理成url編碼方式

2、multipart/form-data,這種編碼方式的表單會以二進制流的方法來處理表單數據。這種編碼方式會將文件域指定文件的內容也封裝到請求參數里

3、text/plain,這種方式主要適用于直接通過表單發送郵件的方式

接下來我們講解一下文件上傳的思路,

1、先是表單提交

2、對數據和附件進行二進制編碼

3、servlet中使用二進制流獲取內容

思路我們已經知道了,那我們就開始編碼吧

我們先在util包下新建一個類,我就起名為UpImgUtils,接下來我們就編碼吧

package util;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import javax.servlet.http.HttpServletRequest;

/**

* upload Img Utils

*

* @author admin

*

*/

public class UpImgUtils {

/*

* 思路 1、從request當中獲取流信息

* 2、新建一個臨時文件,用輸出流指向這個文件

* 3、關閉流

*/

public static void keepFile(HttpServletRequest request) throws IOException {

// 1、從request當中獲取流信息

InputStream fileSource = request.getInputStream();

/*

* 臨時文件的存儲路徑(我們在webContent下新建一個temp文件夾,發布項目的時候很可能因為temp為空,

* 沒在tomcat中建立一個文件夾,到時候自己在發布的項目中添加一個即可)

*/

String tempFileName = request.getServletContext().getRealPath("/") + "temp/tempfile.txt";

// 2、新建一個臨時文件,用輸出流指向這個文件

// 建一個文件

File tempFile = new File( tempFileName );

// 用輸出流指向這個文件

FileOutputStream outputStream = new FileOutputStream( tempFile );

//我們就每次讀寫10K,我們的文件小,這個就已經夠用了

byte[] b = new byte[1024*10];

int n = 0 ;

//讀寫文件,-1標識為空

while( (n = fileSource.read(b) ) != -1 ) {

outputStream.write(b, 0, n);

}

// 3、關閉流

fileSource.close();

outputStream.close();

}

}

這個類就是用來讀取form表單傳來的字節流,寫到一個臨時文件中,我們就一個servlet來調用一下我們的工具來看看效果。

package web;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import util.UpImgUtils;

public class upload extends HttpServlet {

private static final long serialVersionUID = 1L;

public upload() {

super();

// TODO Auto-generated constructor stub

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

UpImgUtils.keepFile(request);

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

doGet(request, response);

}

}

代碼已經寫好,我的項目是java web項目2.5的版本,會自動配置servlet,配置的話,就不再講解。我們來運行看一下效果

我們已經看到了,實際上文件上傳就是把文件的二進制流上傳到服務端,這難道就結束了嗎?

那肯定不可能啊,我們上傳的是個圖片,那我們肯定希望還是圖片啊,我們就來重新封裝一個工具類,在封裝之前,我們先看一下臨時文件的格式

d3b4153e3640d94cb9cffb846cef1753.png

這是我隨便找的兩個文件,上傳后生成的臨時文件,我們就不實戰封裝兩個文件了,我們就實戰一下封裝一個臨時文件,因此呢我們先把input標簽中的multiple屬性去掉,把我們的前端自動生成input標簽的代碼也先注釋掉,我們先看一下改動的代碼

$(document).ready(function(){

//為外面的盒子綁定一個點擊事件

$("#uploadImgBtn").click(function(){

/*

1、先獲取input標簽

2、給input標簽綁定change事件

3、把圖片回顯

*/

// 1、先回去input標簽

var $input = $("#file");

console.log($input)

// 2、給input標簽綁定change事件

$input.on("change" , function(){

console.log(this)

//補充說明:因為我們給input標簽設置multiple屬性,因此一次可以上傳多個文件

//獲取選擇圖片的個數

var files = this.files;

var length = files.length;

console.log("選擇了"+length+"張圖片");

//3、回顯

$.each(files,function(key,value){

//每次都只會遍歷一個圖片數據

var div = document.createElement("div"),

img = document.createElement("img");

div.className = "pic";

var fr = new FileReader();

fr.onload = function(){

img.src=this.result;

div.appendChild(img);

document.body.appendChild(div);

}

fr.readAsDataURL(value);

})

})

//把這下面的注釋掉即可

// //4、我們把當前input標簽的id屬性remove

// $input.removeAttr("id");

// //我們做個標記,再class中再添加一個類名就叫test

// var newInput = '';

// $(this).append($(newInput));

})

})

我們來看一下一個文件的時候,臨時文件的格式

d46950c414181f62e0c1c7777cef47b7.png

我們來分析一下,第二行的filename是我們需要的,這是文件的名稱,我們已經看到中文名稱亂碼,一會編碼的時候,我們需要解決一下;第4行有一個空行,到第5行的時候才到我們的正文部分;我們的正文結束的時候會有一個空格;既然知道了這些,我們就去完善一下我們的工具類吧

package util;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.RandomAccessFile;

import javax.servlet.http.HttpServletRequest;

/**

* upload Img Utils

*

* @author admin

*

*/

public class UpImgUtils {

/*

* 思路 1、從request當中獲取流信息

* 2、新建一個臨時文件,用輸出流指向這個文件

* 3、關閉流

*/

public static void keepFile(HttpServletRequest request) throws IOException {

// 1、從request當中獲取流信息

InputStream fileSource = request.getInputStream();

/*

* 臨時文件的存儲路徑(我們在webContent下新建一個temp文件夾,發布項目的時候很可能因為temp為空,

* 沒在tomcat中建立一個文件夾,到時候自己在發布的項目中添加一個即可)

*/

String tempFileName = request.getServletContext().getRealPath("/") + "temp/tempfile.txt";

//2、新建一個臨時文件,用輸出流指向這個文件

//建一個文件

File tempFile = new File( tempFileName );

//用輸出流指向這個文件

FileOutputStream outputStream = new FileOutputStream( tempFile );

//我們就每次讀寫10K,我們的文件小,這個就已經夠用了

byte[] b = new byte[1024*10];

int n = 0 ;

//讀寫文件,-1標識為空

while( (n = fileSource.read(b) ) != -1 ) {

outputStream.write(b, 0, n);

}

//3、關閉流

fileSource.close();

outputStream.close();

//第二部分......................................................

/**

* 思路

* 1、獲取文件的名稱,并解決中文亂碼

* 2、獲取文件的內容

* 3、保存文件

*/

//第二部分 1、獲取文件的名稱,并解決中文亂碼

RandomAccessFile randomFile = new RandomAccessFile(tempFile,"r");

randomFile.readLine();//先讀取一行

String str = randomFile.readLine();//讀取第二行

int beginIndex = str.lastIndexOf("filename=\"") + 10;//定位到文件名開始的地方

int endIndex = str.lastIndexOf("\"");//定位到文件名結尾的地方

String filename = str.substring(beginIndex, endIndex);

//判斷文件名是全路徑名還是只是文件名(google和火狐是只是文件名,微軟系列是全路徑名)

endIndex = filename.lastIndexOf("\\") + 1;

if( endIndex > -1 ) {

filename = filename.substring(endIndex);

}

//經過上面的這幾步,我們就已經獲取到了文件名,我們還需要解決一下中文名亂碼的問題

//解決上傳文件中文名字亂碼

filename = new String(filename.getBytes("ISO-8859-1"), "UTF-8");

System.out.println("filename: " + filename );

//第二部分 2、獲取文件的內容

//重新定位文件指針到文件頭

randomFile.seek(0);

long startPosition = 0L;//正文開始的位置

int i = 1;

while( ( n = randomFile.readByte() ) != -1 && i <=4 ) {

if( n == '\n') {

startPosition = randomFile.getFilePointer();

i++;

}

}

//

startPosition = randomFile.getFilePointer() - 1 ;

//獲取文件內容,結束位置

randomFile.seek(randomFile.length() );//指針定位到尾部

long endPosition = randomFile.getFilePointer();

int j = 1;

while( endPosition >= 0 && j <=2 ) {

endPosition--;

randomFile.seek(endPosition);

if(randomFile.readByte() == '\n' ) {

j++;

}

}

endPosition = endPosition - 1;

//第二部分 3、保存文件

//設置保存上傳文件的路徑,我們好保存到temp中

String realPath = request.getServletContext().getRealPath("/") + "temp";

File fileupload = new File( realPath );

File saveFile = new File(realPath,filename);

RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile,"rw");

//

//從臨時文件當中讀取文件內容(根據起止位置獲取)

randomFile.seek(startPosition);

while(startPosition < endPosition ) {

randomAccessFile.write(randomFile.readByte());

startPosition = randomFile.getFilePointer();

}

//

//關閉輸入輸出流、刪除臨時文件

randomAccessFile.close();

randomFile.close();

//tempFile.delete();

}

}

我們來看一下效果

95f6ad1fd2684d0658af3f2cb5012ccf.png

這樣的話,我們的上傳圖片也已經上傳成功了,我們來把上傳圖片的url反回給前端吧,這些代碼就不再展示,自己實現一下吧。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395107.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395107.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395107.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于scanf和cin的大數據讀入效率

關于scanf和cin的大數據讀入效率好多大佬都說scanf的讀入效率比cin高&#xff0c;我也當練手&#xff0c;用書上的程序用了個測試&#xff0c;程序如下&#xff1a;#include<iostream>#include<ctime>#include<cstdio>#include<windows.h>using namesp…

OBJECT_ID()的使用方法

數據庫中每個對像都有一個唯一的ID值&#xff0c;用Object_name(id)可以根據ID值得到對像的名稱&#xff0c;object_id(name)可以根據對像名稱得到對象的IDobject_id()只能返回用戶創建的對像的ID,像以sys開頭的表都是系統表所以返回不了的 如下列&#xff1a; select object_n…

Django之model補充:一對多、跨表操作

表結構概述 model.py : class Something(models.Model):name models.CharField(max_length32)class UserType(models.Model):caption models.CharField(max_length32)s models.ForeignKey(Something)# 超級管理員&#xff0c;普通用戶&#xff0c;游客&#xff0c;黑河class…

農民約翰是一個驚人的會計_我的朋友約翰在CSS Grid中犯了一個錯誤。 不要像約翰-這樣做。

農民約翰是一個驚人的會計It had been two years and John had no job.已經兩年了&#xff0c;約翰沒有工作。 John was a smart 20-something guy. Okay, he had a job — but it wasn’t one he liked. It was too monotonous and was not nearly creative enough. His day …

zip直鏈生成網站_手把手教你如何用飛槳自動生成二次元人物頭像

【飛槳開發者說】李思佑&#xff0c;昆明理工大學信息與計算科學大四本科生&#xff1b;2018年和2019年兩次獲得全國大學生數學建模比賽國家二等獎&#xff1b;2020年美國數學建模比賽獲M獎。指導老師&#xff1a;昆明理工大學理學院朱志寧想畫出獨一無二的動漫頭像嗎&#xff…

Gradle入門到實戰(一) — 全面了解Gradle

聲明&#xff1a;本文來自汪磊的博客&#xff0c;轉載請注明出處 可關注個人公眾號&#xff0c;那里更新更及時&#xff0c;閱讀體驗更好&#xff1a; 友情提示由于文章是從個人公眾號拷貝過來整理的&#xff0c;發現圖片沒有正常顯示&#xff0c;沒關注公眾號的同學可通過如下…

java 0-9所有排列_java實現:鍵盤輸入從0~9中任意5個數,排列組合出所有不重復的組合,打印出來...

必有追加大分&#xff01;&#xff01;&#xff01;比如1.2.3.4.5共有120個組合12345&#xff0c;12354&#xff0c;12435&#xff0c;12453&#xff0c;12534&#xff0c;12543&#xff1b;13245&#xff0c;13254&#xff0c;13425&#xff0c;13452&#xff0c;13524&#x…

智能家居物聯網化將成為AWE大會最大看點

AWE大會已經在今日9點半開幕&#xff0c;AWE在今年將擴張至8個展館&#xff0c;其整體展示規模達到11萬平米&#xff0c;這是以往都無法匹敵的。海爾、美的、格力、海信、創維、TCL、康佳、格蘭仕、澳柯瑪、新飛、美菱、奧馬、方太、老板、萬和、萬家樂、華帝、帥康、櫻花、格美…

PHP 命名空間(namespace)

PHP 命名空間(namespace) PHP 命名空間(namespace)是在PHP 5.3中加入的&#xff0c;如果你學過C#和Java&#xff0c;那命名空間就不算什么新事物。 不過在PHP當中還是有著相當重要的意義。 PHP 命名空間可以解決以下兩類問題&#xff1a; 用戶編寫的代碼與PHP內部的類/函數/常量…

給matrix重新列名_如何認真升級Mac終端(甚至給它一個Matrix主題)

給matrix重新列名by Marcus Gardiner通過馬庫斯加德納(Marcus Gardiner) 如何認真升級Mac終端(甚至給它一個Matrix主題) (How to seriously upgrade your Mac terminal (and even give it a Matrix theme)) 藍色藥丸&#xff0c;紅色藥丸和通往極樂世界的3個步驟 (A Blue Pill…

javaweb 圖書管理系統完整代碼_看一名Java開發人員以紅隊思維五分鐘審計一套代碼(續)...

前言上篇文章的發布引起了很多讀者的瀏覽&#xff0c;有很多讀者也催更希望讀到續集&#xff0c;作者也收獲到讀者的鼓勵&#xff0c;說明這條路線對大家有幫助&#xff0c;是有意義的。所以&#xff0c;今天作者將繼續闡述在審計Java代碼時的思路。概述上篇文章所講的SQL注入和…

愛立信數據分析解決方案抓住物聯網發展機遇

愛立信在2016年1月6日至9日于美國拉斯維加斯舉辦的國際消費電子展&#xff08;CES&#xff09;上推出“用戶和物聯網數據分析”解決方案。該解決方案將能幫助運營商提高對用戶和物聯網終端的內部管理效率&#xff0c;同時探索跨越多個垂直領域的新型物聯網應用。 用戶和物聯網數…

Lua初學習 9-12 基礎

1&#xff1a;string 轉 number :tonumber(string) 2: number 轉 string :tostring(number) 3:string API: Lua中的字符串是不可變值&#xff0c;a "cocotang" string.gsub(a,"c","z") print(a) ----> cocotang 1獲得字符串長度:string.le…

iview下拉選

問題描述&#xff1a;創建場景&#xff0c;連續創建場景時&#xff0c;第一個場景創建成功后&#xff0c;第二次進入創建窗口&#xff0c;點擊測試任務下拉編輯只有上次創建成功的那一個任務候選&#xff0c;選中該任務中&#xff0c;關聯腳本也只有上次成功創建的唯一個候選下…

JAVA實現在面板中添加圖表_Java 創建PowerPoint圖表并為其添加趨勢線

圖表&#xff0c;是指將既得數據用圖形的方式表示出來。在前文中我們介紹過如何使用Java程序來為Excel文檔創建圖表的方法。本文將通過使用Java程序來演示如何創建PowerPoint圖表及為圖表添加趨勢線。趨勢線的運用能夠顯示數據的變化趨勢&#xff0c;同時能夠幫助預測數據的未來…

code warri_我參加了有史以來的第一屆Warri Tech宣傳活動。 這是我學到的。

code warriIn the city of Warri, Delta state of Nigeria, there is a saying that goes “Warri nor dey carry last, if e hard well well na draw”. This translates to “Warri is never behind in the scheme of things (events)”.在尼日利亞三角洲州的沃里市&#xff…

Socket編程小結

目錄&#xff1a; 什么是 socket&#xff1f;... 1 Internet 套接字的兩種類型... 1 網絡理論... 2 結構體... 2 本機轉換... 3 IP 地址和如何處理它們... 4 socket()函數... 4 bind()函數... 4 connect()程序... 5 listen()函數... 6 accept()函數... 6 send() and recv() 7 …

idea設置中文界面_《英雄聯盟手游》設置界面中文翻譯圖分享 外服漢化界面一覽...

導讀 英雄聯盟手游目前以及正式上線了&#xff0c;不過現在的話是沒有中文版的&#xff0c;只有外服&#xff0c;所有很多地方是看不懂的&#xff0c;也不明白的&#xff0c;這樣的話就需要翻譯了&#xff0c;具體要怎么設置會比較&#xff0c;相關的步驟是什么呢&#xff1f;下…

windows 2008 r2 系統默認80端口被系統占用的處理

--windows 2008 r2 系統默認80端口被系統占用的處理 --使用netstat 命令查看指定端口netstat -ano | findstr :80----如下所示&#xff1a;本地的80端口被進程為4的占用 TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4 TCP 192.168.1.207:60652 …

java實現封裝的三部_Java 封裝

Java 封裝在面向對象程式設計方法中&#xff0c;封裝(英語&#xff1a;Encapsulation)是指&#xff0c;一種將抽象性函式接口的實作細節部份包裝、隱藏起來的方法。封裝可以被認為是一個保護屏障&#xff0c;防止該類的代碼和數據被外部類定義的代碼隨機訪問。要訪問該類的代碼…