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,一经查实,立即删除!

相关文章

zip直链生成网站_手把手教你如何用飞桨自动生成二次元人物头像

【飞桨开发者说】李思佑&#xff0c;昆明理工大学信息与计算科学大四本科生&#xff1b;2018年和2019年两次获得全国大学生数学建模比赛国家二等奖&#xff1b;2020年美国数学建模比赛获M奖。指导老师&#xff1a;昆明理工大学理学院朱志宁想画出独一无二的动漫头像吗&#xff…

Gradle入门到实战(一) — 全面了解Gradle

声明&#xff1a;本文来自汪磊的博客&#xff0c;转载请注明出处 可关注个人公众号&#xff0c;那里更新更及时&#xff0c;阅读体验更好&#xff1a; 友情提示由于文章是从个人公众号拷贝过来整理的&#xff0c;发现图片没有正常显示&#xff0c;没关注公众号的同学可通过如下…

javaweb 图书管理系统完整代码_看一名Java开发人员以红队思维五分钟审计一套代码(续)...

前言上篇文章的发布引起了很多读者的浏览&#xff0c;有很多读者也催更希望读到续集&#xff0c;作者也收获到读者的鼓励&#xff0c;说明这条路线对大家有帮助&#xff0c;是有意义的。所以&#xff0c;今天作者将继续阐述在审计Java代码时的思路。概述上篇文章所讲的SQL注入和…

爱立信数据分析解决方案抓住物联网发展机遇

爱立信在2016年1月6日至9日于美国拉斯维加斯举办的国际消费电子展&#xff08;CES&#xff09;上推出“用户和物联网数据分析”解决方案。该解决方案将能帮助运营商提高对用户和物联网终端的内部管理效率&#xff0c;同时探索跨越多个垂直领域的新型物联网应用。 用户和物联网数…

JAVA实现在面板中添加图表_Java 创建PowerPoint图表并为其添加趋势线

图表&#xff0c;是指将既得数据用图形的方式表示出来。在前文中我们介绍过如何使用Java程序来为Excel文档创建图表的方法。本文将通过使用Java程序来演示如何创建PowerPoint图表及为图表添加趋势线。趋势线的运用能够显示数据的变化趋势&#xff0c;同时能够帮助预测数据的未来…

idea设置中文界面_《英雄联盟手游》设置界面中文翻译图分享 外服汉化界面一览...

导读 英雄联盟手游目前以及正式上线了&#xff0c;不过现在的话是没有中文版的&#xff0c;只有外服&#xff0c;所有很多地方是看不懂的&#xff0c;也不明白的&#xff0c;这样的话就需要翻译了&#xff0c;具体要怎么设置会比较&#xff0c;相关的步骤是什么呢&#xff1f;下…

安卓10不支持qmc解码_官宣:安卓10已发布!21款手机已适配,小米华为率先支持...

随着今天凌晨谷歌 I/O 大会的召开&#xff0c;Android Q 也就是安卓10正式官宣&#xff0c;新版的安卓10加入了诸多新手势&#xff0c;从 Home 键设计上看&#xff0c;安卓10 的新版手势很大程度上有疑似借鉴 iOS 的手势&#xff0c;底部一个长条&#xff0c;作为 Home 用来返回…

linux系统编程之进程(七):system()函数使用【转】

本文转载自&#xff1a;http://www.cnblogs.com/mickole/p/3187974.html 一&#xff0c;system()理解 功能&#xff1a;system()函数调用“/bin/sh -c command”执行特定的命令&#xff0c;阻塞当前进程直到command命令执行完毕 原型&#xff1a; int system(const char *comma…

汉王云名片识别(SM)组件开发详解

大家好&#xff0c;最近在DeviceOne平台上做了一个汉王云名片识别的功能组件。下面把我开发过程给大家做一个分享&#xff0c;希望可以帮助到大家。 下面我把我的思路给大家讲解一下。1.找到我要集成的sdk&#xff0c;也就是汉王云名片的sdk下载&#xff08;android和ios&#…

[App Store Connect帮助]八、维护您的 App(4.2)查看评分与评论

您可以查看 App 的总评分或单个顾客评论。如有必要&#xff0c;您可以针对某条评论报告问题。 【注】顾客可以为您的 iOS 和 macOS App 评分并撰写评论&#xff0c;但只能为 Apple TVOS App 评分。 必要职能&#xff1a;“帐户持有人”职能、“管理”职能、“App 管理”职能、“…

visio studio json工具_《产品经理入门指南》彩蛋2:别技淫原型图!你的Visio和Balsamiq Mockup入门了吗?...

温馨提示&#xff1a;如果你有关于产品经理方面的任何问题&#xff0c;欢迎关注我的微信公众号与我互动。最新的免费系统的产品经理课程《老司机带你做产品》已经推出&#xff0c;请关注微信公众号&#xff1a;iamliuwenzhi很多产品新人刚开始工作时&#xff0c;喜欢一拿到需求…

mysql牵引例子_MySQL学习06(事务和索引)

事务概述什么是事务事务就是将一组SQL语句放在同一批次内去执行如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行MySQL事务处理只支持InnoDB和BDB数据表类型事务的ACID原则原子性(Atomic)整个事务中的所有操作&#xff0c;要么全部完成&#xff0c;要么全部不完成&#…

android操作系统 真的吗_旋挖机培训学校真的能学会吗,旋挖钻机到底有哪些操作系统...

旋挖机培训学校真的能学会吗添加微&#xff1a;yywyyc 旋挖钻机到底有哪些操作系统【前言】很多使用旋挖钻机或者想要了解旋挖钻机的工程公司可能不是特别了解旋挖钻机本身的系统以及部件&#xff0c;本篇文章针对旋挖钻机的操作系统来给大家介绍一下&#xff0c;让大家了…

WebAPI 2参数绑定方法

简单类型参数 Example 1: Sending a simple parameter in the Url [RoutePrefix("api/values")] public class ValuesController : ApiController {// http://localhost:49407/api/values/example1?id2[Route("example1")][HttpGet]public string Get(int…

java怎么引入html文件路径_如何在public_html中读取文件但在域外?使用相对路径...

我正在尝试从我的(附加组件)域目录之外的目录中读取文件 . 这是我的目录结构&#xff1a;public_html /domain /file_read.phpfile_write.phpsensitive /file.dat虽然我能够使用“../sensitive/file.dat”写入敏感&#xff0c;但我无法使用相同的方法进行读取 . 有什么想法吗&a…

csv文件怎么转成excel_Java读写excel,excel转成json写入磁盘文件

pom读写excel主要的dependency<dependency> <groupId>org.apache.poigroupId> <artifactId>poiartifactId> <version>3.16version> dependency> <dependency> <groupId>org.apache.poigroupId> …

前端做CRM管理系统是做什么_代办行业的CRM客户关系管理系统应该是什么样子的?...

随着互联网的深耕细化&#xff0c;很多企业也在不断优化自己的办公方式&#xff0c;以优化企业的办公流程&#xff0c;提高企业的办事效率。因此实现办公自动化&#xff0c;或者说实现数字化办公就需要逐渐提上日程。今天给大家讲讲可以帮助代办行业实现办公自动化的产品&#…

蓝牙 sig base uuid_蓝牙模块采用陶瓷天线和PCB天线的区别

一、陶瓷天线陶瓷天线是一种适合于蓝牙设备使用的小型化天线,又分为块状陶瓷天线和多层陶瓷天线。陶瓷天线占用空间很小、性能比较好&#xff1b; 带宽窄&#xff0c;比较难做到多频段&#xff1b;有效提高主板的整合度&#xff0c;并可降低天线对ID的限制&#xff1b;需要在主…

app启动页自动跳转源码_关于移动端App启动页的策划方案

App启动页是指app在启东时需要加载必要的运行环境和配置&#xff0c;在这个过程中提示用户等待的一个过渡页面。在产品经理眼里启动页是app给予用户重要的第一印象&#xff1b;也是App最重要的黄金页面之一&#xff0c;所有用户100%都会看到的页面。启动页适合用来做以下几个事…

java 如何排查内存溢出_java 内存溢出排查

测试代码&#xff0c;如下示例&#xff1a;import java.util.ArrayList;import java.util.List;/*** Description 测试内存溢出, 启动时设置参数&#xff0c;最大堆内存为1m, 内存溢出时dump出内存文件 -Xmx1m -XX:HeapDumpOutOfMemoryError* Author luzy* Date 2018/10/5 11:0…