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.mzph.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;防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码…