图片上传接口的实现 记录一下,方便自己以后查看。
由于最近用到了图片上传的功能,就在网上找了很多例子来看,最终实现了图片上传功能,以及更新项目不会将服务器的图片覆盖掉,在这边记录一下,防止日后遗忘。
项目需要,只需要将上传的图片保存到服务器中,并返回一个外网可以访问的地址就行。
代码部分
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"><display-name>Instant-Upload</display-name><servlet><servlet-name>UploadHandleServlet</servlet-name><servlet-class>servlet.UploadHandleServlet</servlet-class></servlet><servlet-mapping><servlet-name>UploadHandleServlet</servlet-name><url-pattern>/servlet/UploadHandleServlet</url-pattern></servlet-mapping>
</web-app>
pom.xml
</dependency><!-- 文件上传依赖 --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency></dependencies>
jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<title>文件上传</title>
</head>
<script></script>
<body><form action="${pageContext.request.contextPath}/servlet/UploadHandleServlet" enctype="multipart/form-data" method="post">上传用户:<input type="text" name="username"><br /> 上传文件1:<input type="file" name="file1"><br /> 上传文件2:<input type="file" name="file2"><br /> <input type="submit" value="提交"></form>
</body>
</html>
service
package servlet;import java.awt.Image;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.util.List;
import java.util.UUID;import javax.imageio.ImageIO;
import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;@SuppressWarnings("serial")
public class UploadHandleServlet extends HttpServlet{public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 得到上传文件的保存目录,将上传的文件存放于服务器/opt/upload目录下
// String savePath = "/opt/upload";//得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");File sFile = new File(savePath);// 判断上传文件的保存目录是否存在if (!sFile.exists()) {// 创建目录sFile.mkdir();}//上传时生成临时文件保存目录String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp/");File tempFile = new File(tempPath);// 判断上传文件的保存目录是否存在if (!tempFile.exists()) {// 创建临时目录tempFile.mkdir();}//设置编码格式response.setCharacterEncoding("GBK");//使用PrintWriter 将保存的图片地址返回给前端PrintWriter out = response.getWriter();//消息提示String message = "";String url = "";try {//使用Apache文件上传组件处理文件上传步骤//1.创建一个DiskFileItemFactory工厂DiskFileItemFactory factory = new DiskFileItemFactory();//设置工厂缓冲区的大小,当上传文件的大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。factory.setSizeThreshold(1024*100);//设置上传时生成的临时文件的保存目录factory.setRepository(tempFile);//2.创建一个文件上传解析器ServletFileUpload upload = new ServletFileUpload(factory);//解决上传的文件名的中文乱码upload.setHeaderEncoding("UTF-8");if(!ServletFileUpload.isMultipartContent(request)){//按照传统方式获取数据return; }//设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MBupload.setFileSizeMax(1024*1024);//设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MBupload.setSizeMax(1024*1024*10);//4.使用ServletFileUpload解析器解析上传的数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项List<FileItem> list = upload.parseRequest(request);for(FileItem item : list) {//如果fileitem中封装的是上传文件//得到上传文件的名称String fileName = item.getName();if(fileName == null || fileName.trim().equals("")) {continue;}//处理获取到的上传文件的文件名的路径部分,只保留文件名部分fileName = fileName.substring(fileName.lastIndexOf("\\")+1);//获取item中的上传文件的输入流InputStream in = item.getInputStream();//判断上传文件的输入流是否为图片if(isImage(in)) {InputStream input = item.getInputStream();String saveFileName = makeFileName(fileName);// String saveSavePath = ImageUtil.makePath(saveFileName,savePath);//创建一个文件的输出流FileOutputStream fout = new FileOutputStream(savePath+ "/" +saveFileName);//创建一个缓冲区byte buffer[] = new byte[1024];//判断一个输入流中的数据是否已经读完的标识int len = 0;//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据while((len = input.read(buffer))>0) {//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + fileName)当中fout.write(buffer, 0, len);}input.close();fout.close();item.delete();InetAddress addr = InetAddress.getLocalHost(); String ip=addr.getHostAddress().toString(); //获取本机ip // 获取图片地址 url = ip+"/upload/"+saveFileName;out.println(url); }else {out.println("上传图片失败,该文件不是图片!");}}}catch (FileUploadBase.FileSizeLimitExceededException e) {e.printStackTrace();out.println("单个文件超出最大值");} catch (Exception e) {out.println( "上传文件失败");e.printStackTrace();}}/** 判断是否为图片*/public static boolean isImage(InputStream inputStream) {if (inputStream == null) {return false;}Image img;try {img = ImageIO.read(inputStream);return !(img == null || img.getWidth(null) <= 0 || img.getHeight(null) <= 0);} catch (Exception e) {return false;}}/** 设置图片的文件名*/public static String makeFileName(String fileName) {//为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名//return UUID.randomUUID().toString()+"_"+fileName; 这里由于保存的文件名过长,就取消了+文件名保存return UUID.randomUUID().toString();}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{doGet(request,response);}
}
设置虚拟路径
设置虚拟路劲的目的是隐藏了存储图片的地址,将地址变成了/upload,这样外网在访问的时候就是 本地地址/upload/存储的图片名字,也就是上文的ip+“/upload”+saveFileName ,这样你上传图片后返回一个外网可以访问的地址给前端展示图片。也可以将地址存到数据库中,按照实际要求来写。
如果实际要发布到服务器上,那么就要将存储的地址改为服务器中的目录,并且不要放在项目中,因为如果项目重新发布会将之前上传的图片清空,必须手动复制到其他地方,发布之后在移回。这样就很麻烦,所以放在外面,然后ip就改为服务器的地址,因为我们是在eclipse中添加的虚拟地址,实际发布后需要进入服务器tomcat的server.xml文件中,在Host下添加虚拟路径:
<Context path="/upload" docBase="D:\developSoft\apache-tomcat-7.0.47\webapps\wpgl"></Context> |
eclipse设置:
打开服务器,测试图片上传功能已经成功实现。
开启服务器后没有弹出网页,是因为没有在配置页面,需要自行打开http://localhost:8080/项目名/upload.jsp localhost:8080是你本地服务器。
参考文章地址:https://www.cnblogs.com/xdp-gacl/p/4200090.html#!comments
图片上传接口的实现 记录一下,方便自己以后查看。相关推荐
- Asp.NetCoreWebApi图片上传接口(二)集成IdentityServer4授权访问(附源码)
写在前面 本文地址:http://www.cnblogs.com/yilezhu/p/9315644.html 作者:yilezhu 上一篇关于Asp.Net Core Web Api图片上传的文章使 ...
- nodejs微信支付小微商户申请入驻时,如何实现图片上传接口
微信支付小微商户可以通过小程序<微信买单服务商助手>来进件,也可以通过API接口来进件(详情可查阅小微商户专属接口文档). 通过API接口进件前需要先在商户资料中的身份证照片和门店照片通过 ...
- 性能服务器图片介绍大图,服务端图片图片上传接口性能压测总结
服务端图片上传接口性能压测总结 一.性能测试时需要关注点 用户操作的相应时间 服务器资源使用情况是否合理 应用服务器和数据库资源使用是否合理 系统能否实现扩展 系统最多支持多少用户访问.系统最大业务处 ...
- Layui富文本编辑器图片上传接口(.NET C#)
本来想偷懒找个现成的接口,搜了一下发现没有现成的,那我在这写一个并分享给大家吧. demo打包好了在我的csdn下载中心:http://download.csdn.net/download/xiang ...
- python生成图片链接_python 实现图片上传接口开发 并生成可以访问的图片url
版本:python3.7 功能,开发一个用户访问的页面,支持图片上传,并将其保存在服务器. 项目结构: app.py文件内容如下: from flask import Flask, Response, ...
- 【校招VIP】[约起来] 接口设计1:图片上传接口
今天来看商业实战项目约起来的第一个模块,活动发布模块的接口设计,这期课程包括两个接口,一个是图片上传,一个是活动发布后的提交. 首先了解图片上传接口,常规的图片上传需要前后端配合.前端通过接口传给后端 ...
- 使用python flask框架开发图片上传接口 详细案例
python版本:3.6+ 需要模块:flask,pillow 需求:开发一个支持多格式图片上传的接口,并且将图片压缩,支持在线预览图片. 目录结构: app.py编辑内容: from flask i ...
- 互联网直播点播平台EasyDSS登录页广告位图片上传接口报错问题分析
我们的互联网直播点播EasyDSS经过改版之后,增加了一些项目,比如我们上次说的在登陆页增加了广告位:EasyDSS登录页如何实现插入产品广告位. 我们在增加此处宣传位的时候,可以直接把图片进行上传. ...
- php图片上传 thinkphp5,thinkphp5图片上传接口
public function avatarUpload() { $file = request()->file('file'); $filePath = 'avatar'; $width = ...
最新文章
- nonatomic与atomic的区别与作用
- golang输入命令行参数
- 以效率为根本,网易慢跑要做“另类”的TO B业务
- 拦截器,过滤器,监听器原理
- php smarty框架案例,php封装的smarty类案例
- CentOS赋予一个普通用户root权限
- 2021年周边游数据报告
- php simplexmlelement array,php中SimpleXMLElement 对象转换为数组
- webpack 实用配置总结
- 【Tensorflow】下载预训练模型和参数小结
- 卸载一个游戏计算机里还有文件,如何处理pc游戏卸载后留下的残余文件?
- 如何用计算机测量图片景深,用比较仔细的测量搞清楚“景深”(1.实测景深与公式比较)...
- 如何写好一份数据分析报告
- linux用屏幕录制软件下载,vokoscreenNG(屏幕录制软件)下载_vokoscreenNG(屏幕录制软件)官方下载-太平洋下载中心...
- Android Google Map集成以及部分功能的实现
- 计算机水平毕业研究生7分落户,研究生毕业如何进行上海积分落户?
- 数字信号处理matlab卷积函数conv,filter函数详细介绍三秒钟就看懂。
- 设计模式-策略模式,模板方法模式练习
- IOS开发笔记之常用的第三方库(太多了。)
- 企业客户管理软件排名