关于图片上传到服务器并保存到数据库然后读出显示到页面上的一系列例子
图片上传的设计与实现
┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊图片上传的设计与实现二.设计目的运用jsp开发工具和数据库开发一个小型的基于Web系统。
要求提交详细的设计说明书及各步骤所需图表和文档,对复杂的代码段和程序段,应画出程序流程图。
在界面设计中,画出每个窗口的布局。
通过本实践性教学环节,能较好地巩固jsp基本知识,jsp连接数据库实现动态网页。
三.需求分析如今时代,互联网已经进入我们的生活,而互联网上就有图片上传,显示,访问等等功能,有着很大的市场空间。
图片上传必须实现:1.数据库访问模块:利用JavaBean封装对数据库的操作,主要包括连接数据库、添加、删除、查询数据表、关闭连接等功能;2.上传模块:通过上传组件实现图片的上传。
3.显示模块:提供图片信息列表的显示效果。
4.查看模块:点击可以显示图片的内容。
四.总体设计图片上传是指客户端通过Web应用程序将本地图片资源传输到服务器上。
在客户端需要显示图片时,服务器端将图片通过网络以流的形式发送给客户端,然后利用不同的形式显示图片。
图片上传必须要对电子相册有,用户注册,用户注册,添加相片,修改相册,用户反馈,管理用户,如图1所示。
图1 总体设计┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊1.文件上传组件介绍文件上传组件是一些开源组织发布的针对实现文件上传功能的一组class 文件。
jspSmartUpload和Apache的common-fileupload是两个比较流行的文件上传组件。
这两个组件都可以在JSP中实现文件上传。
本节使用Apache的common-fileupload组件实现图片上传。
2.HTML中文件上传组件介绍HTML中<input type="file"/>元素可以创建文件上传组件。
该控件带有一个文本框和浏览按钮。
使用该组件时要注意以下几点。
将文件保存到数据库
将⽂件保存到数据库介绍为什么要将⽂件保存到数据库呢?理由很多,最直接的就是,将⽂件放⼊数据库以后,可以对⽂件进⾏更好的管理,特别是⽂本⽂件、图⽚等,如果不使⽤数据库,数量巨⼤的时候,很难做到有效的管理和区别。
特别是需要作⼀些与⽂字密切相关的应⽤的时候,将⽂件全部放⼊数据库是最好的选择,对⽂字的处理、检索等,都可以直接利⽤数据库的⼀些功能,可以做到真正的有效管理。
本⽂举例主要针对以⽂字为基础的⽂件,⽐如WORD等,但是,实际上对程序稍微修改,就可以上传所有⽂件类型。
数据表结构现在,我们来看存放⽂件的数据库表结构,这⾥,我们给出建⽴表的标准SQL语句:CREATE TABLE tblBooksUpload(DocID int NOT NULL IDENTITY Primary Key ,DocTitle varchar (200) ,Doc image,DocType varchar (50) ,Entrydate datetime Default GetDate())以上的语句中,我们看到数据表tblBooksUpload包含五个字段:字段DocID是表的关键字段,数据记录编号;字段DocTitle是⽤来简单说明上传⽂件的,如果上传⽂本⽂件,我们⼀般将其设置为⽂件标题,图像、程序等,就设置为图像、程序的简单介绍;字段Doc是⽤来存放我们上传的⽂件的字段,注意,这⾥将Doc字段的设置为Image类别;字段DocType⽤来保存我们上传⽂件的类型,可能我们奇怪为什么要这个字段呢?其实,这个字段是很重要的,在⽤户从数据库取得数据的时候,这个字段将⽤来指定数据字段Doc中数据的类别,然后,浏览器根据这个字段来决定呈现给⽤户的数据;字段DateTime是⼀个时间字段,我们可以看到该字段的值取⾃服务器的当前⽇期。
下⾯是插⼊数据的存储过程,我们来看具体代码:CREATE PROCEDURE uSP_BooksUploadFile@Title varchar(200),@Doc image,@DocType varchar(4)ASINSERT tblBooksUpload(DocTitle,Doc,DocType)VALUES (@Title,@Doc,@DocType)GO上传⽂件的步骤现在,我们先从⽂字上了解⼀下上传⽂件到数据库的具体步骤,再从代码上来实现:⾸先,从客户端取得上传的⽂件,然后,我们将它放⼊数据流;第⼆,服务器端读取数据流,然后将其保存到缓存;第三,将缓存数据保存到数据库;现在,我们⼀步步来看怎样在程序中实现这些功能。
百度ueditor富文本编辑器实现上传文件、图片、视频到ftp服务器并在页面端回显
百度ueditor富⽂本编辑器实现上传⽂件、图⽚、视频到ftp服务器并在页⾯端回显之前⼀直⽤ueditor作为富⽂本编辑器,想要实现图⽚上传到ftp的功能,⽹上搜索了⼀圈,发现都感觉讲的不是很明⽩,⽽且有不少要引⼊其他的java代码,最近⾃⼰试了⼀下,终于调通了,希望能帮到各位。
废话不多说,查看步骤。
(注意,这个是springboot版本,其实springmvc的也差不多,有⼀点点不同,最后我会说明)1.将utf8-jsp的整个⽂件夹复制到resources的static⽬录下,打开之后⽬录如下。
项⽬⽬录如下(我多加了⼀层ueditor⽬录,不过也⼀样)2.写两个controller,代码如下(请忽略楼主潦草的代码,⾃⼰拿回去调整⼀下,修改⼀下UploadController中ftp的地址,密码即可,总共有三个地⽅)1.UploadControllerpackage com.wang.controller;import lombok.extern.slf4j.Slf4j;import mons.fileupload.FileItem;import mons.fileupload.disk.DiskFileItemFactory;import mons.fileupload.servlet.ServletFileUpload;import .ftp.FTP;import .ftp.FTPClient;import .ftp.FTPConnectionClosedException;import .ftp.FTPReply;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import javax.imageio.ImageIO;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.awt.image.BufferedImage;import java.io.*;import .URLEncoder;import java.text.SimpleDateFormat;import java.util.*;@RequestMapping("/ueditor/file")@Controller@Slf4jpublic class UploadController {private FTPClient ftpClient = new FTPClient();private Logger logger = LoggerFactory.getLogger(UploadController.class);//上传图⽚并回显@RequestMapping("/uploadImg")@ResponseBodypublic Map<String,Object> upload(HttpServletRequest request) throws Exception {Map<String ,Object> map = new HashMap<>();// 判断enctype属性是否为multipart/form-databoolean isMultipart = ServletFileUpload.isMultipartContent(request);if (!isMultipart)throw new IllegalArgumentException("上传内容不是有效的multipart/form-data类型.");// Create a factory for disk-based file itemsDiskFileItemFactory factory = new DiskFileItemFactory();// Create a new file upload handlerServletFileUpload upload = new ServletFileUpload(factory);FileItem item = (FileItem) iter.next();// 如果是⽂件字段String fieldName = item.getFieldName();String orginFileName = item.getName();String imgSunffix = orginFileName.substring(stIndexOf(".")); String uuid = UUID.randomUUID().toString().replaceAll("-", "");String fileName = uuid+imgSunffix;// String contentType = item.getContentType();// boolean isInMemory = item.isInMemory();// long sizeInBytes = item.getSize();// String filePath = STORE_FILE_DIR + fileName;//写⼊⽂件到当前服务器磁盘// File uploadedFile = new File(filePath);SimpleDateFormat formatPath = new SimpleDateFormat("yyMMdd");SimpleDateFormat fromahhPath = new SimpleDateFormat("HH");String yyMMdd = formatPath.format(new Date());String hours = fromahhPath.format(new Date());String ftpfilePath = yyMMdd + "/" + hours;// FileInputStream fileInputStream = (FileInputStream) item.getInputStream(); InputStream inputStream = item.getInputStream();BufferedInputStream bufferedInputStream = null;bufferedInputStream = new BufferedInputStream(inputStream);FTPClient ftp = new FTPClient();try {int reply;ftp.connect("11111", 21);// 连接FTP服务器// 如果采⽤默认端⼝,可以使⽤ftp.connect(url)的⽅式直接连接FTP服务器 ftp.login("11111", "11111");// 登录ftp.setFileType(FTP.BINARY_FILE_TYPE);ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);reply = ftp.getReplyCode();if(!FTPReply.isPositiveCompletion(reply)){ftp.disconnect();throw new IOException("ftp登录失败");}for (String str:ftpfilePath.split("/")){ftp.makeDirectory(str);ftp.changeWorkingDirectory(str);}boolean tag = ftp.appendFile(fileName,bufferedInputStream);if(!tag){throw new Exception("保存到FTP失败");}}catch (Exception e){e.printStackTrace();}finally {try {inputStream.close();ftp.logout();} catch (IOException e) {e.printStackTrace();}if(ftp.isConnected()){try {ftp.disconnect();}catch (IOException e){e.printStackTrace();}}}String path = "/"+ftpfilePath+"/"+fileName;// item.write(uploadedFile);map.put("state","SUCCESS");map.put("url",path);map.put("title",orginFileName);map.put("original",orginFileName);}// response.setCharacterEncoding("UTF-8");// response.getWriter().println("上传成功");return map;}//回显图⽚// imgPath = "ftpfile\\upload\\11.png";OutputStream os = null;ftp = new FTPClient();ftp.setConnectTimeout(1000 * 30);//设置连接超时时间ftp.setControlEncoding("utf-8");//设置ftp字符集ftp.enterLocalPassiveMode();//设置被动模式,⽂件传输端⼝设置try {int reply;ftp.connect("11111", 21);// 连接FTP服务器// 如果采⽤默认端⼝,可以使⽤ftp.connect(url)的⽅式直接连接FTP服务器ftp.login("11111", "11111");// 登录ftp.setFileType(FTP.BINARY_FILE_TYPE);ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);reply = ftp.getReplyCode();if (!FTPReply.isPositiveCompletion(reply)) {ftp.disconnect();throw new IOException("FTP登录失败");}//下载⽂件 FTP协议⾥⾯,规定⽂件名编码为iso-8859-1,所以读取时要将⽂件名转码为iso-8859-1//如果没有设置按照UTF-8读,获取的流是空值nullin = ftp.retrieveFileStream(new String(imgPath.getBytes("UTF-8"), "iso-8859-1"));String picType = imgPath.split("\\.")[1];BufferedImage bufImg = null;bufImg = ImageIO.read(in);os = response.getOutputStream();ImageIO.write(bufImg, picType, os);} catch (IOException e) {e.printStackTrace();} finally {try {in.close();// 在这⾥关闭,保证⼀定要关闭ftp.logout();// 在这⾥登出,保证⼀定要登出} catch (IOException e) {e.printStackTrace();}if (ftp.isConnected()) {try {ftp.disconnect();} catch (IOException ioe) {}}}response.setContentType("image/jpg");}/*** 下载⽂件到浏览器* @param response* @throws IOException*/@RequestMapping("/downloadFile.do")@ResponseBodypublic void downFile(@RequestParam("path")String path, HttpServletResponse response) throws IOException {// 获取ftp信息// 获取⽂件名称String[] strs = path.split("/");String downloadFile = strs[strs.length - 1];try {// 设置⽂件ContentType类型,这样设置,会⾃动判断下载⽂件类型response.setContentType("application/x-msdownload");// 设置⽂件头:最后⼀个参数是设置下载的⽂件名并编码为UTF-8response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8")); // 建⽴连接connectToServer();ftpClient.enterLocalPassiveMode();// 设置传输⼆进制⽂件int reply = ftpClient.getReplyCode();// ftpClient.changeWorkingDirectory("./home/ftp");if(!FTPReply.isPositiveCompletion(reply)) {ftpClient.disconnect();throw new IOException("failed to connect to the FTP Server:"+21);}// 此句代码适⽤Linux的FTP服务器String newPath = new String(path.getBytes("GBK"),"ISO-8859-1");bis = new BufferedInputStream(is);OutputStream out = response.getOutputStream();byte[] buf = new byte[1024];int len = 0;while ((len = bis.read(buf)) > 0) {out.write(buf, 0, len);}out.flush();} catch (Exception e) {e.printStackTrace();} finally {closeConnect();if (bis != null) {try {bis.close();} catch (IOException e) {e.printStackTrace();}}if (is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}} catch (FTPConnectionClosedException e) {logger.error("ftp连接被关闭!", e);throw e;} catch (Exception e) {logger.error("ERR : upload file "+ downloadFile+ " from ftp : failed!", e);}}/*** 连接到ftp服务器*/private void connectToServer() throws Exception {// ftpClient.connect(server,21);if (!ftpClient.isConnected()) {int reply;try {ftpClient=new FTPClient();ftpClient.connect("111111", 21);// 连接FTP服务器// 如果采⽤默认端⼝,可以使⽤ftp.connect(url)的⽅式直接连接FTP服务器ftpClient.login("111111", "111111");// 登录reply = ftpClient.getReplyCode();if (!FTPReply.isPositiveCompletion(reply)) {ftpClient.disconnect();("connectToServer FTP server refused connection.");}}catch(FTPConnectionClosedException ex){logger.error("服务器:IP:"+21+"没有连接数!there are too many connected users,please try later", ex); throw ex;}catch (Exception e) {logger.error("登录ftp服务器【"+21+"】失败", e);throw e;}}}/**** 功能:关闭连接*/public void closeConnect() {try {if (ftpClient != null) {ftpClient.logout();ftpClient.disconnect();}} catch (Exception e) {logger.error("ftp连接关闭失败!", e);} 2.ServerControllerpackage com.wang.controller;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.baidu.ueditor.ActionEnter;import org.springframework.core.io.ClassPathResource;import org.springframework.stereotype.Controller;import org.springframework.util.ClassUtils;import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;//ueditor单独上传的controller@Controllerpublic class ServerController {@RequestMapping("/configNew")public void config(HttpServletRequest request, HttpServletResponse response){response.setContentType("application/json");// String res = ClassUtils.getDefaultClassLoader().getResource("km").getPath();// System.out.println("res:"+res);System.out.println("路径:"+ClassUtils.getDefaultClassLoader().getResource("").getPath());// String rootPath = ClassUtils.getDefaultClassLoader().getResource("../../").getPath() + "static/ueditor/jsp"; String rootPath = ClassUtils.getDefaultClassLoader().getResource("").getPath() + "static/ueditor/jsp";System.out.println("root路径:"+rootPath);try {response.setCharacterEncoding("UTF-8");String exec = new ActionEnter(request, rootPath).exec();System.out.println(exec);PrintWriter writer = response.getWriter();writer.write(new ActionEnter(request, rootPath).exec());writer.flush();writer.close();} catch (IOException e) {e.printStackTrace();}}// public void getUEConfig(HttpServletRequest request, HttpServletResponse response){// org.springframework.core.io.Resource res = new ClassPathResource("config.json");// InputStream is = null;// response.setHeader("Content-Type" , "text/html");// try {// is = new FileInputStream(res.getFile());// StringBuffer sb = new StringBuffer();// byte[] b = new byte[1024];// int length=0;// while(-1!=(length=is.read(b))){// sb.append(new String(b,0,length,"utf-8"));// }// String result = sb.toString().replaceAll("/\\*(.|[\\r\\n])*?\\*/","");// JSONObject json = JSON.parseObject(result);// PrintWriter out = response.getWriter();// out.print(json.toString());// } catch (IOException e) {// e.printStackTrace();// }finally {// try {// is.close();// } catch (IOException e) {// e.printStackTrace();// }// }// }} 3.修改ueditor.config.jsvar URL = window.UEDITOR_HOME_URL || getUEBasePath();var server_url = window.location.protocol+"//"+window.location.hostname+":"+window.location.port;/*** 配置项主体。
Java实现上传文件图片到指定服务器目录
Java实现上传⽂件图⽚到指定服务器⽬录具体代码如下所⽰:***web.xml***<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="/2001/XMLSchema-instance" xmlns="/xml/ns/javaee" xmlns:web="/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="/xml/ns/javaee /xm <servlet><servlet-name>fileUpload</servlet-name><servlet-class>.action.FileUpload</servlet-class></servlet><servlet-mapping><servlet-name>fileUpload</servlet-name><url-pattern>/fileUpload</url-pattern></servlet-mapping></web-app>package .action;import java.io.File;import java.io.*;import java.io.IOException;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import mons.fileupload.FileItem;import mons.fileupload.FileUploadException;import mons.fileupload.disk.DiskFileItemFactory;import mons.fileupload.servlet.ServletFileUpload;/**** @author Administrator* ⽂件上传* 具体步骤:* 1)获得磁盘⽂件条⽬⼯⼚ DiskFileItemFactory 要导包* 2)利⽤ request 获取真实路径,供临时⽂件存储,和最终⽂件存储,这两个存储位置可不同,也可相同* 3)对 DiskFileItemFactory 对象设置⼀些属性* 4)⾼⽔平的API⽂件上传处理 ServletFileUpload upload = new ServletFileUpload(factory);* ⽬的是调⽤ parseRequest(request)⽅法获得 FileItem 集合list ,** 5)在 FileItem 对象中获取信息,遍历,判断表单提交过来的信息是否是普通⽂本信息另做处理* 6)* 第⼀种. ⽤第三⽅提供的 item.write( new File(path,filename) ); 直接写到磁盘上* 第⼆种. ⼿动处理**/public class FileUpload extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("utf-8"); //设置编码//获得磁盘⽂件条⽬⼯⼚DiskFileItemFactory factory = new DiskFileItemFactory();//获取⽂件需要上传到的路径String path = request.getRealPath("/upload1");// String path = "c:/upload1";//如果没以下两⾏设置的话,上传⼤的⽂件会占⽤很多内存,//设置暂时存放的存储室 , 这个存储室,可以和最终存储⽂件的⽬录不同/*** 原理它是先存到暂时存储室,然后在真正写到对应⽬录的硬盘上,* 按理来说当上传⼀个⽂件时,其实是上传了两份,第⼀个是以 .tem 格式的* 然后再将其真正写到对应⽬录的硬盘上*/factory.setRepository(new File(path));//设置缓存的⼤⼩,当上传⽂件的容量超过该缓存时,直接放到暂时存储室factory.setSizeThreshold(1024*1024) ;//⾼⽔平的API⽂件上传处理ServletFileUpload upload = new ServletFileUpload(factory);try {//可以上传多个⽂件List<FileItem> list = (List<FileItem>)upload.parseRequest(request);for(FileItem item : list){//获取表单的属性名字String name = item.getFieldName();//如果获取的表单信息是普通的⽂本信息if(item.isFormField()){//获取⽤户具体输⼊的字符串,名字起得挺好,因为表单提交过来的是字符串类型的String value = item.getString() ;request.setAttribute(name, value);}else{//对传⼊的⾮简单的字符串进⾏处理,⽐如说⼆进制的图⽚,电影这些/*** 以下三步,主要获取上传⽂件的名字*///获取路径名String value = item.getName() ;//索引到最后⼀个反斜杠int start = stIndexOf("\\");//截取上传⽂件的字符串名字,加1是去掉反斜杠,String filename = value.substring(start+1);request.setAttribute(name, filename);//真正写到磁盘上//它抛出的异常⽤exception 捕捉//item.write( new File(path,filename) );//第三⽅提供的//⼿动写的OutputStream out = new FileOutputStream(new File(path,filename));InputStream in = item.getInputStream() ;int length = 0 ;byte [] buf = new byte[1024] ;System.out.println("获取上传⽂件的总共的容量:"+item.getSize());// in.read(buf) 每次读到的数据存放在 buf 数组中while( (length = in.read(buf) ) != -1){//在 buf 数组中取出数据写到(输出流)磁盘上out.write(buf, 0, length);}in.close();out.close();}}}catch (FileUploadException e) {e.printStackTrace();}catch (Exception e) {e.printStackTrace();}request.getRequestDispatcher("filedemo.jsp").forward(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}***index.jsp***<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>上传⼊⼝</title></head><body><form action="fileUpload" enctype="multipart/form-data" method="post" >⽤户名称:<input type="text" name="usename"> <br/>上传图⽚:<input type="file" name="file1"><br/>上传⽂件:<input type="file" name="file2"><br/><input type="submit" value="提交"/></form></body></html>***filedemo.jsp***<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>上传⽂件图⽚案列</title></head><body>⽤户名称:${ename }<br />图⽚名称:${requestScope.file1 }<br />⽂件名称:${requestScope.file2 }<br /><!-- 把上传的图⽚显⽰出来 --><img alt="go" src="upload1/<%=(String) request.getAttribute("file1")%> " /></body></html>总结以上所述是⼩编给⼤家介绍的Java实现上传⽂件图⽚到指定服务器⽬录,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。
实物资产管理中的图片批量导入数据库的方法及系统
实物资产管理中的图片批量导入数据库的方法及系统在当今数字化的时代,企业对于实物资产的管理越来越依赖于信息化系统。
实物资产的管理不仅涉及到资产的基本信息,如名称、型号、价值等,还常常需要关联实物资产的图片,以便更直观、准确地进行识别和管理。
然而,如何将大量的实物资产图片批量导入数据库,成为了一个亟待解决的问题。
一、批量导入图片的重要性实物资产图片能够提供更直观、详细的资产信息。
通过图片,管理人员可以迅速了解资产的外观、状态,减少对文字描述的依赖,提高管理效率和准确性。
批量导入图片能够大大节省时间和人力成本,避免逐个处理图片的繁琐过程。
对于拥有大量实物资产的企业来说,这一点尤为重要。
二、图片批量导入数据库面临的挑战1、图片格式和大小的多样性实物资产图片可能来自不同的设备和来源,格式各异,如 JPEG、PNG 等,而且图片的大小也各不相同。
这就需要在导入过程中进行格式转换和大小调整,以适应数据库的存储要求。
2、数据准确性和一致性确保图片与对应的实物资产信息准确匹配,避免出现张冠李戴的情况。
同时,要保证所有图片的相关属性(如拍摄时间、拍摄地点等)在数据库中的记录保持一致。
3、数据库性能大量图片的同时导入可能会对数据库的性能造成影响,导致系统响应变慢甚至崩溃。
因此,需要优化导入过程,减少对数据库的压力。
4、网络传输问题如果图片需要通过网络传输到数据库服务器,网络的稳定性和带宽可能会成为限制因素,导致传输中断或延迟。
三、图片批量导入数据库的方法1、前端预处理在客户端对图片进行预处理,包括格式转换、大小调整、压缩等操作。
可以使用一些图像处理工具或库,如 ImageMagick、OpenCV 等,将图片统一转换为数据库支持的格式,并调整到合适的大小和分辨率。
同时,为每张图片生成唯一的标识符,以便与实物资产信息进行关联。
2、数据分批处理将大量的图片分成较小的批次进行导入。
这样可以避免一次性处理过多的数据导致数据库性能下降。
JSP上传图片到数据库的例子
现在想写个程序向数据库中插入图片路径(或则插入图片也可以)最好是插入图片的路径这样可插入任意大的图片...请高手指点一下思路..感激不尽1.通过显示层向数据库中插入图片2.在界面显示的时候是小图片(缩小过的)3.当点击查看大图片会显示图片(原来的大小)提供给你图片上传和显示的代码吧!希望对你有帮助我在程序代码里贴了向Mysql数据库写入image代码的程序,可是好多人都是Java的初学者,对于这段代码,他们无法将它转换成jsp,所以我在这在写一下用jsp怎样向数据库写入图像文件。
大家先在数据库建这样一张表,我下面的这些代码对任何数据库都通用,只要支持blob类型的只要大家将连接数据库的参数改一下就可以了。
SQL> create table image(id int,content varchar(200),image blob);如果在sqlserver2000的数据库中,可以将blob字段换为image类型,这在SqlServer2000中是新增的。
testimage.html文件内容如下:<HTML><HEAD><TITLE> Image File </TITLE><meta http-equiv= "Content-Type " content= "text/html; charset=gb2312 "></HEAD><FORM METHOD=POST ACTION= "testimage.jsp "><INPUT TYPE= "text " NAME= "content "> <BR><INPUT TYPE= "file " NAME= "image "> <BR><INPUT TYPE= "submit "> </FORM><BODY></BODY></HTML>我们在Form的action里定义了一个动作testimage.jsp,它的内容如下:<%@ page contentType= "text/html;charset=gb2312 "%><%@ page import= "java.sql.* " %><%@ page import= "java.util.* "%><%@ page import= "java.text.* "%><%@ page import= "java.io.* "%><html><%Class.forName( "org.gjt.mm.mysql.Driver ").newInstance();String url= "jdbc:mysql://localhost/mysql?user=root&password=&useUnicode=true&characterEncoding=885 9_1 ";//其中mysql为你数据库的名字,user为你连接数据库的用户,password为你连接数据库用户的密码,可自己改Connection conn= DriverManager.getConnection(url);String content=request.getParameter( "content ");String filename=request.getParameter( "image ");FileInputStream str=new FileInputStream(filename);String sql= "insert into test(id,content,image) values(1,?,?) ";PreparedStatement pstmt=dbconn.conn.prepareStatement(sql);pstmt.setString(1,content);pstmt.setBinaryStream(2,str,str.available());pstmt.execute();out.println( "Success,You Have Insert an Image Successfully ");%>下面我写一个测试image输出的例子看我们上面程序写的对不对,testimageout.jsp的内容如下:<%@ page contentType= "text/html;charset=gb2312 "%><%@ page import= "java.sql.* " %><%@ page import= "java.util.* "%><%@ page import= "java.text.* "%><%@ page import= "java.io.* "%><html><body><%Class.forName( "org.gjt.mm.mysql.Driver ").newInstance();String url= "jdbc:mysql://localhost/mysql?user=root&password=&useUnicode=true&characterEncoding=885 9_1 ";//其中mysql为你数据库的名字,user为你连接数据库的用户,password为你连接数据库用户的密码,可自己改Connection conn= DriverManager.getConnection(url);String sql = "select image from test where id =1 ";Statement stmt=null;ResultSet rs=null;try{stmt=conn.createStatement();rs=stmt.executeQuery(sql);}catch(SQLException e){}while(rs.next()) {res.setContentType( "image/jpeg ");ServletOutputStream sout = response.getOutputStream();InputStream in = rs.getBinaryStream(1);byte b[] = new byte[0x7a120];for(int i = in.read(b); i != -1;){sout.write(b);in.read(b);}sout.flush();sout.close();}}catch(Exception e){System.out.println(e);}%></body></html>你运行这个程序,你就会看到刚才你写入美丽的图片就会显示在你面前。
base64字符串转文件,以及ngImgCrop裁剪图片并上传保存到服务器示例
base64字符串转⽂件,以及ngImgCrop裁剪图⽚并上传保存到服务器⽰例base64字符串是包含⽂件格式的⽂件字符串,例如:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAgAElEQVR4Xsy9+……根据base64字符串可以转化成真实的⽂件。
思路是,⾸先将base64字符串读取城字节数组;然后将字节数组读⼊到字节流(内存流);其次将base64字符串开头部分包含的⽂件格式提取出来,得到⽂件类型并转换成相应后缀名;最后,根据字节流和⽂件类型,即可转化成相应的⽂件,并保存到物理磁盘。
特别是最近玩AngularJS时候,⽤到图⽚上传,裁剪图⽚保存功能,需要⽤到ngImgCrop裁剪图⽚控件。
它就是将图⽚裁剪后保存成base64字符串结果的。
⽰例:base64编码的⽂本转为图⽚/// <summary>/// base64编码的⽂本转为图⽚/// </summary>/// <param name="base64"></param>/// <returns></returns>private static Image Base64StringToImage(string base64){ byte[] bytes = Convert.FromBase64String(base64); using (MemoryStream ms = new MemoryStream(bytes)) { Bitmap bmp = new Bitmap(ms); return bmp; }}⽰例:获取base64字符串开头部分包含的⽂件格式var m = new Regex(@"(?<=data\:)[\w\/_\.]+(?=\;)", RegexOptions.IgnoreCase).Match(byteStr);string ContentType = null != m ? m.Value : "image/png";⽰例:获取⽂件⼤⼩/// <summary>/// 获取⽂件/⽂件夹⼤⼩(字节)/// </summary>/// <param name="filePath">路径</param>/// <returns></returns>private static long FileSize(string filePath){ long temp = 0; //路径是否是⽂件 if (File.Exists(filePath) == false) { //⽂件⽬录 string[] entries = Directory.GetFileSystemEntries(filePath); foreach (string item in entries) { //遍历⽂件⽬录内的所有⼦⽂件⽬录,⼦⽂件 temp += FileSize(item); } } else { FileInfo fileInfo = new FileInfo(filePath); return fileInfo.Length; //获取真实⽂件的⼤⼩(字节) } return temp;}全部代码:1public class FileUploadResultModel2 {3public Guid FileID { get; set; }4public long FileSize { get; set; }5 }678public static class Base64FileHandle9 {10///<summary>11/// base64编码的⽂本转为图⽚12///</summary>13///<param name="base64"></param>14///<returns></returns>15private static Image Base64StringToImage(string base64)16 {17byte[] bytes = Convert.FromBase64String(base64);18using (MemoryStream ms = new MemoryStream(bytes))19 {20 Bitmap bmp = new Bitmap(ms);21return bmp;22 }23 }24///<summary>25///获取⽂件/⽂件夹⼤⼩(字节)26///</summary>27///<param name="filePath">路径</param>28///<returns></returns>29private static long FileSize(string filePath)30 {31long temp = 0;32if (File.Exists(filePath) == false)33 {34string[] entries = Directory.GetFileSystemEntries(filePath);35foreach (string item in entries)36 {37 temp += FileSize(item);38 }39 }40else41 {42 FileInfo fileInfo = new FileInfo(filePath);43return fileInfo.Length;44 }45return temp;46 }47private static string SuffixName(string ContentType)48 {49switch (ContentType.Trim().ToLower())50 {51case"image/jpg":52case"image/jpeg":53return".jpg";5455case"image/gif":56return".gif";57case"image/bmp":58return".bmp";59case"image/png":60return".png";61default:62return"";63 }64 }6566///<summary>67///创建圈⼦68///</summary>69///<param name="community"></param>70///<returns></returns>71public static ResponseModel<FileUploadResultModel> ngImgCropHandle(string base64) 72 {73var response = new ResponseModel<FileUploadResultModel>() { IsLogin = true };7475string byteStr = base64.Trim();//data:image/png;base64,76int delLength = byteStr.IndexOf(',') + 1;77string str = byteStr.Substring(delLength, byteStr.Length - delLength);78 Image returnImage = Base64StringToImage(str);7980var m = new Regex(@"(?<=data\:)[\w\/_\.]+(?=\;)", RegexOptions.IgnoreCase).Match(byteStr); 81string ContentType = null != m ? m.Value : "image/png";8283 Guid filename = Guid.NewGuid();84string filepath = @"D:\wwwroot\" + filename + SuffixName(ContentType);85 returnImage.Save(filepath);8687 response.Data = new FileUploadResultModel() { FileID = filename, FileSize = FileSize(filepath) };88 response.Success = true;89 response.Message = "ok";90return response;91 }929394 }。
基于PHP和MySQL的图片上传和显示
片上传、 储和显示的程序设计方案。 存
E cy e 属 性 设 置 为 M ut a tf r My QL 的 字 符 集 为 GB 这 样 才 能 在 n tp l p r/o m— i S K,
1 P HP上传 文件 的相 关技术
dt , t n属 性 值 设 置 为 P aa Aci o HP程 序 文 件 My QL 数 据 库 中 正 确 地 存 储 题 目 的 汉 S
—
¥c n = on
my q sl
cn et ( ” onc
—
/此 处 为 连接 M y QL, 开 e a 数 / S 打 xm 据 库 的 代 码
’
i sc 一 mg r
节 ;¥ F L S[pcห้องสมุดไป่ตู้e] ’ n me] ( 函 数 将 二 进 制 文 件 数 据 转 换 为 十 六 进 so i . h ?i一表 的 I 段 值 ’ I E ’i i ’ [t tl mp a ’ ) h wpc p p d t D字 >元
才 存 放 文 件 被 上 传 后 在 服 务 端 存 储 的 临 时 制 数 据 , 能 正 确 地 将 图 片 数 据 存 储 到 素 , 表 中 相 应 记 录 的 图 片 显 示 在 页 面 将
—
如 ae x m. P HP是 目前 流 行 的一 种 W e b服 务 器 名 ( sv e a php)。
字 。 果 采 用 My QL 4 0或 以 下 版 本 , 如 S . 则
要 删 除 程 序 中 的 ¥p o o一 ’x . i2 e ht O ’bn h x
. S 端 脚 本 编 程 语 言 。 HP4 1及 以 上 版 本提 2 3 保 存 图 片 到 My QL数 据 库 P .
c#客户端图片上传到服务器端文件并且把路径保存到SQL数据库
c#客户端图⽚上传到服务器端⽂件并且把路径保存到SQL数据库//这是⼀个上传图⽚的例⼦,上传其他⽂件都⼀样string strFileFullName = System.IO.Path.GetFileName(this.FileUpload1.PostedFile.FileName);if (strFileFullName.Length > 0){if (FileUpload1.HasFile){string newFileName = GetNewFileName(strFileFullName);string path = Server.MapPath("[服务器端存储图⽚的路径]" + newFileName);string pathSaveImg = Server.MapPath("[服务器端存储图⽚的路径]" + newFileName);this.FileUpload1.SaveAs(path);[数据库字段]= "[服务器端存储图⽚的路径]" + newFileName;}else{MessageBox.Show(this, "找不到此图⽚"); return;}}//跟据⽂件名产⽣⼀个由时间+随机数组成的⼀个新的⽂件名//因为客户端上传的⽂件很可能会重名,所以要对⽂件名进⾏重命名public static string GetNewFileName(string FileName){Random rand = new Random();string newfilename = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + "m" +DateTime.Now.Day.ToString() + "d"+ DateTime.Now.Second.ToString() + DateTime.Now.Minute.ToString()+ lisecond.ToString()+ "a" + rand.Next(1000).ToString()+ FileName.Substring(stIndexOf("."), FileName.Length - stIndexOf("."));return newfilename;}。
HTML5实现图片预览和查看原图
HTML5实现图⽚预览和查看原图html5从⼀开始就给开发者很多的期待,提供众多新的API,不⽤再想以前⼀样,为了实现某个功能写很多的代码。
在以前,如果要实现图⽚预览会怎么做呢,因为为了安全的原因,web端的js是不能读取⽂件的本地真实路径的,那么只能将图⽚上传到服务器上,然后再拿到图⽚的链接,这样才能实现图⽚预览。
⽽服务器呢,⽐如有两个⽂件夹,⼀个是临时⽂件夹,⼀个是正式⽂件夹,临时⽂件夹会定时进⾏清理,正式⽂件夹是⽤户确认使⽤的图⽚存储的位置。
1. fileReader现在html5提供的API不再让图⽚预览那么⿇烦,FileReader提供了很多的⽅法来进⾏图⽚预览和⽂本读取,同时也提供了⼀整套完整的事件来捕获⽂件的状态,如下:FileReader接⼝的⽅法 FileReader接⼝有4个⽅法,其中3个⽤来读取⽂件,另⼀个⽤来中断读取。
⽆论读取成功或失败,⽅法并不会返回读取结果,这⼀结果存储在result属性中。
⽅法名参数描述readAsBinaryString file将⽂件读取为⼆进制编码readAsText file[, encoding]按照格式将⽂件读取为⽂本,encode默认为UTF-8readAsDataURL file将⽂件读取为DataUrlabort(none)终端读取操作FileReader接⼝事件 FileReader接⼝包含了⼀套完整的事件模型,⽤于捕获读取⽂件时的状态。
事件描述onabort中断onerror出错onloadstart开始onprogress正在读取onload成功读取onloadend读取完成,⽆论成功失败2. 使⽤ fileReader 读取图⽚从上⾯的表格中,我们可以⼤致了解fileReader提供哪些⽅法和事件,不过本⽂主要是讲解图⽚的读取,那么我们就是⽤readAsDataURL()就可以了。
不过,在进⾏这⼀切之前,我们必须检测当前的浏览器是否⽀持HTML5的fileReader,别进⾏了⼀系列的处理和操作,结果js报错,说fileReader没有定义。
图片上传原理
图片上传原理在网页开发中,图片上传是一个非常常见的功能,用户可以通过上传图片的方式将图片保存到服务器上,然后在网页上进行展示。
图片上传的原理其实并不复杂,下面我们就来详细介绍一下图片上传的原理。
首先,我们需要了解的是,图片上传是通过表单来实现的。
在HTML中,我们可以使用<input type="file">来创建一个文件上传的表单元素。
用户通过点击这个元素,就可以选择本地的图片文件进行上传。
当用户选择了要上传的图片文件后,点击提交按钮,表单就会将图片文件发送到服务器。
在这个过程中,浏览器会将图片文件转换成二进制流,然后通过HTTP协议将这个二进制流发送给服务器。
服务器接收到图片文件后,会将这个文件保存到指定的目录中。
通常情况下,服务器会对上传的图片文件进行一些安全性检查,比如检查文件类型、文件大小等,以防止恶意上传或者过大的文件占用过多的服务器资源。
接着,服务器会将图片文件的路径保存到数据库中,以便后续在网页上进行展示。
当用户访问网页时,服务器会从数据库中读取图片文件的路径,然后将这些图片文件发送给浏览器,浏览器再根据这些路径去请求服务器上的图片文件,最终将图片显示在网页上。
总的来说,图片上传的原理就是通过表单将图片文件发送到服务器,服务器接收并保存图片文件,然后在网页上进行展示。
这个过程涉及到前端和后端的交互,需要注意安全性和效率等方面的问题。
在实际开发中,我们可以使用现成的图片上传组件来简化开发流程,比如使用第三方库或者框架,来实现图片上传的功能。
同时,我们也需要注意图片上传的安全性,比如防止恶意上传、限制文件大小等,以保护服务器和用户的利益。
总结一下,图片上传的原理是通过表单将图片文件发送到服务器,服务器接收并保存图片文件,然后在网页上进行展示。
在开发过程中,我们需要注意安全性和效率等方面的问题,以提供良好的用户体验和保护服务器的安全。
希望以上内容能够对大家有所帮助。
百度ueditor富文本--图片保存路径的配置以及上传到远程服务器
百度ueditor富⽂本--图⽚保存路径的配置以及上传到远程服务器我们在上篇⽂章中学习了上传图⽚的配置:百度ueditor富⽂本--配置图⽚上传在⽂章的最后讲到 ueditor 默认设置的保存图⽚的路径是相对路径,项⽬相关的。
保存的图⽚会放在tomcat的webapp⽬录下的项⽬⽂件夹中。
F:\tomcat7\webapps\ROOT这样的配置会导致重启 tomcat后保存的图⽚丢失。
解决⽅法⼀修改图⽚保存路径在tomcat的webapp中项⽬之外修改了config.json中的imagePathFormat参数重新设置图⽚保存路径,⽐如:"imagePathFormat": "/../temp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以⾃定义保存路径和⽂件名格式 */我们这⾥在原路径上加了/../temp。
意思是项⽬路径ROOT⾥的的上⼀级路径,也就是路径设置为项⽬之外,webapp中。
如图:F:\tomcat7\webapps\temp\ueditor\jsp\upload\image\20170825需要注意的是:⼀、图⽚保存路径在项⽬之外最好先新建好⽂件夹,不然第⼀次上传图⽚时创建⽬录速度会⽐较慢,会导致⾸张图⽚回调找不到图⽚404。
图⽚保存的路径最好在tomcat的webapp⽂件夹中,这样我们才能访问到图⽚。
如果图⽚不在Webapp⽬录下的,需要做做映射才能访问图⽚,回调显⽰图⽚才能成功。
UEditor后端保存图⽚到⽬标位置之后,返回前端⼀个url。
前端根据url,去取图⽚,取不到。
如果想把图⽚存储到⾮Webapp等硬盘⽬录,⽐如C:/img,需要⼿动修改controller.jsp的rootPath[java] view plain copy print?1. <%@ page language="java" contentType="text/html; charset=UTF-8"2. import="com.baidu.ueditor.ActionEnter"3. pageEncoding="UTF-8"%>4. <%@ page trimDirectiveWhitespaces="true" %>5. <%6.7. request.setCharacterEncoding( "utf-8" );8. response.setHeader("Content-Type" , "text/html");8. response.setHeader("Content-Type" , "text/html");9.10. //String rootPath = application.getRealPath( "/" );11. String rootPath = "c:/img";12. System.out.print(rootPath);13. out.write( new ActionEnter( request, rootPath ).exec() );14.15. %>图⽚保存在项⽬的外⾯,⽐如C:/img,前端请求不可能直接访问到,需要做映射。
js实现上传图片到服务器
js实现上传图⽚到服务器本⽂实例为⼤家分享了js实现上传图⽚到服务器的具体代码,供⼤家参考,具体内容如下HTML//多张图⽚上传multiple<input type="file" id="file" multiple>//原⽣提交按钮<input type="submit">javascript<script>// 定义⼀个接收转为base64图⽚的数组let ArrayImg=[]var index = 0; //给图⽚加唯⼀标识好删除// 获取页⾯上的元素let input=document.getElementById('file')console.log(input);// 绑定oncheange事件input.onchange=function(){var file=this.files[0] //获取页⾯上选择的⽂件[N]指的是获取第⼏个// console.log(file);var iLen = this.files.length; //获取图⽚长度// console.log(iLen);for(var i=0;i<iLen;i++){ //通过循环把多张图⽚显⽰到页⾯上或者上传// 本地缓存预览var filereader = new FileReader() //创建⼀个本地缓存的对象// 把获取到的⽂件本地缓存转为bese64filereader.readAsDataURL(this.files[i]) //转成base64,并存在了⾃由属性reader.result⾥console.log([i]);filereader.onload = function () { //通过onload 事件把this.result 取出来// console.log(this.result,333);ArrayImg.push(this.result)// 通过html标签包括到img显⽰图⽚放到⼀个变量中储存let img1=`<div id="divimg"><img src="${this.result}" alt="" id="id_img"></div>`// 创建⼀个新的divlet div = document.createElement('div')div['index'] = index; // 给div加唯⼀标识好移除// 把上传存好的img1放到新建的div⾥⾯div.innerHTML=img1console.log(ArrayImg,'图⽚数组');//然后通过dom操作插⼊到dom树中显⽰图⽚document.getElementsByTagName('body')[0].appendChild(div) //插⼊dom树// console.log(img);// 通过给div绑定单击事件删除当前点击的div跟当前点击的图⽚数组中的base64地址div.onclick = function(){this.remove(); // 在页⾯中删除该图⽚元素delete ArrayImg[this.index]; // 删除ArrayImg数组对应的数据console.log(ArrayImg,'图⽚数组');}//inddex记录当前循环了多少次好移除ArrayImg数组中的链接地址index++}}}</script>以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
网页在本地很正常,为何上传到虚拟主机之后就看
网页在本地很正常,为何上传到虚拟主机之后就看
答:
1、请确认图片已上传至服务器。
2、制作网页时插入的图片均应采用相对路径来标记。
若您不慎使用了绝对路径或者本地路径,如:c:/images/a.jpg,则会出现在本地浏览正常而上传后却找不到的现象。
实际上出现这个问题最常见的就是路径问题,很多用户在本地喜欢用带有盘符的如D://这样的链接,而实际你的网站到服务器和虚拟主机上后不可能和你本地的路径一样这就是造成图片不显示无法调用的最重要原因,处理的方法也很简单只需要设计网页时采用相对路径,如首页在根目录下,和他同级目录有一个IMG的文件夹放了一个1.GIF的图片,调用路径就是img/1.gif 这样不管你上传到那里只要原文件结构不变都不会出现图片不显示的问题。
怎么上传图片
怎么上传图片在很多情况下,我们需要在网页、社交媒体或者聊天软件中上传图片。
无论是发布个人照片还是分享工作文件,上传图片成为了我们日常生活的一部分。
本文将介绍如何方便快捷地上传图片。
1. 使用文件上传按钮大多数网页和应用程序提供了上传文件的功能。
通常,在网页中,你可以找到一个“上传文件”或者“选择文件”的按钮,点击这个按钮将弹出一个文件选择对话框。
文件上传按钮文件上传按钮在文件选择对话框中,你可以浏览并选择你想要上传的图片。
在选择完图片后,点击“确定”或者“打开”按钮将开始上传过程。
上传完成后,你将收到一个成功上传的消息或者图片在页面中显示出来。
2. 拖拽图片到指定区域除了使用文件上传按钮,许多网页和应用程序还支持通过拖拽图片来上传。
具体操作方法如下:1.在你的计算机上找到你想要上传的图片。
2.打开网页或者应用程序,找到一个指定区域,通常会有一个“拖拽图片到此区域”或者类似的提示。
3.按住鼠标左键,将图片拖拽到指定区域。
4.松开鼠标左键,上传过程将自动开始。
上传完成后,你将收到上传成功的消息或者图片将立即显示在页面中。
3. 使用截图工具如果你想上传的图片是你当前屏幕截图,你可以使用截图工具来进行快速上传。
1.打开截图工具,通常可以通过按下“Print Screen”键或者在操作系统中搜索的方式来找到截图工具。
2.在截图工具中,选择“截取屏幕”或者“选择区域”等选项,然后点击“确定”按钮。
3.截图工具将自动将截取的图片复制到剪贴板中。
4.打开你想要上传图片的网页或者应用程序,并按下“Ctrl+V”组合键来粘贴图片。
5.上传过程将自动开始,上传完成后你将收到上传成功的消息或者图片将显示在页面中。
4. 使用云存储服务云存储服务允许你将图片上传到网络上的云空间中,并提供一个唯一的URL给你使用。
通过使用云存储服务,你可以轻松地在不同设备之间共享图片,或者将图片插入到网页或博客中。
以下是一些常用的云存储服务:•Google Drive•Dropbox•OneDrive•iCloud Drive使用云存储服务上传图片的步骤如下:1.打开云存储服务的网站或应用程序。
el-upload uploadfile使用方法
el-upload是Element UI框架中的一个文件上传组件,可以方便地实现文件的上传操作。
在实际项目中,我们经常会使用到文件上传的功能,因此掌握el-upload的使用方法对我们来说是非常重要的。
本文将介绍el-upload的使用方法,并给出具体的案例进行说明。
一、el-upload的基本使用1.1 引入el-upload组件在使用el-upload组件之前,我们需要确保已经安装了Element UI框架。
在需要使用el-upload组件的地方引入该组件:```<template><el-uploadclass="upload-demo"action="xxx":auto-upload="false"><el-button slot="trigger" size="small" type="primary">选取文件</el-button><el-button style="margin-left: 10px;" size="small"type="success">上传到服务器</el-button><p slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</p></el-upload></template>```1.2 el-upload的属性上述代码中,我们可以看到el-upload组件有几个重要的属性:- action:上传的位置区域,这里是一个示例位置区域,实际使用时需要根据后台接口进行调整。
springMVC自动转义问题
springMVC⾃动转义问题今天遇到个神奇的问题,前端上传图⽚到⽂件服务器上,然后将图⽚地址传到后台,后台保存路径到数据库中,但是展⽰的时候路径⼀直有问题。
⽐如前端⼊参...../953983fd-576b-44fb-ae11-57b5e78ced73?q-sign-algorithm=sha1&q-ak=AKIDmNksnTjNZeV9Y4qo37UcbS6WhdKtaI8j&q-sign-time=1582808716;1582809616&q-key-time=1582808716;然后后台返回的却是...../953983fd-576b-44fb-ae11-57b5e78ced73?q-sign-algorithm=sha1&q-ak=AKIDmNksnTjNZeV9Y4qo37UcbS6WhdKtaI8j&q-sign-time=1582808716;1582809616&q-key-time=1582808716;也就是会将&转义成&出现这种问题的原因就是springMVC对于特殊字符会进⾏转义,例如&---->&但是具体的源码没有找到在哪,后⾯有时间再去找⼀下。
解决⽅法可以有以下⼏种:1、StringEscapeUtilsjava中可以使⽤ ng3 包中的 StringEscapeUtils.unescapeHtml4(String str) ⽅法来进⾏解码。
不过会提⽰这个⽅法被弃⽤了,可以使⽤mons.text.StringEscapeUtils,maven依赖如下:<dependency><groupId>mons</groupId><artifactId>commons-text</artifactId><version>1.1</version></dependency>String unescapeHtml4 = StringEscapeUtils.unescapeHtml4(sysAd.getImgPath());通过这个⽅法就能将已经被转义的字符还原回来。
基于ASP .NET实现图片存储数据库及页面读取研究与应用
基于实现图片存储数据库及页面读取研究与应用摘要:对于中存储签名图片,做了一个详细解决方案。
完善了客服端碰到的在数据库存储一个签名图片所遇到的问题。
关键词:;数据库;存储图片;SQL Serve0引言随着计算机网络与信息技术的迅速发展,Web已经成为各类信息系统开发的主流平台,许多信息网站在发布信息时均采用基于数据库的动态信息发布系统。
基于技术进行图片的上传与下载,需要使用专门的ASP文件上传组件或ISAPI扩展程序,这限制了程序设计的灵活性。
同时由于图片属于复杂类型数据,在SQL Server 数据库中与声音、大型电子表格等共用一个image字段类型,而且图片本身也有不同的数据格式,如.Gif或.Jpg,无法用操作一般字段的方法进行存取。
针对这一实际问题,本文介绍了基于ASP.NET 实现Web图片存取的新方法,通过利用ASP.NET中的上传文件对HttpPostedFile、ADO.NET Stream对象及ADO、NET提供的经过优化的SQL Server对象集,使Web信息中的图片上传到服务器并存入后台数据库,以及从数据库读取图片并在网页上显示更为简捷高效。
采用开发环境为+SQL2000数据库。
1图片的处理方式对于图片的处理有两种方式:①图片数据以文件形式直接存储在硬盘,在数据库中保存该图片的记录附加信息(路径、文件名、注释);②图片直接存储在数据库中。
这两种方式各有利弊。
图片文件存入数据库中便于管理与维护,而存入硬盘可能会因为不小心删除图片文件,而使得数据不一致,但图片放在数据库中不便于修改编辑, 同时会引起数据库读取数据时的I/O 消耗,而放在硬盘上则不会引起这个问题。
所以对于小文件,建议放在数据库中便于管理,而对于大文件,不可放在数据库中,否则数据库表会大量产生数据文件的碎片。
图系统结构模型2图片存储方法该系统使用 和SQL Server 数据库实现图片的存储。
将图片存放到硬盘指定的目录下,将图片的相对存储路径和其它附属信息存储到数据库中。
多图片上传的原理
多图片上传的原理
多图片上传的原理是通过前端的表单上传控件或者第三方的JavaScript插件,用户可以选择多个图片文件进行上传。
当用
户点击上传按钮时,前端将选中的图片文件通过HTTP请求发送给后端服务器。
在后端,服务器接收到这些图片文件后,会将它们保存到临时文件夹中,并给每个图片文件生成一个唯一的文件名。
然后,服务器将这些临时文件路径或文件名返回给前端。
前端接收到服务器返回的临时文件路径或文件名后,会根据需要进行处理,比如将这些文件路径或文件名显示在页面上,或者将它们保存到数据库中。
当用户最终确认提交时,前端会将临时文件路径或文件名作为参数发送给后端,后端根据这些参数找到对应的临时文件,然后将这些临时文件保存到永久文件夹中。
同时,服务器会清理临时文件夹中的文件。
这样,多图片上传的原理就是通过前端将选中的图片文件发送给后端,后端将这些图片保存到临时文件夹,然后返回临时文件路径或文件名给前端,最后前端将确认提交时的临时文件路径或文件名发送给后端,后端将临时文件保存到永久文件夹中。
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
微信端调取相册和摄像头功能,实现图⽚上传,并上传到服务器最近在做微信公众号⽹页开发,遇到两个需要⽤到微信的JSSDK,上传图⽚和⾃动定位,微信开发者⽂档有详细的步奏内容,链接点击,也可以看看我这篇⽂章,看我是如何实现的。
⾸先第⼀步,需要在页⾯引⼊微信的JS⽂件(http和https都⾏)<script src="https:///open/js/jweixin-1.2.0.js"></script>第⼆步,获取签名后台会给前端⼀个接⼝,前端通过这个接⼝发送请求获取必要的签名信息,并进⾏配置sendAjax.weixin.getSdkSign({'传⼊参数'},function(msg){let sdkSign = msg.sdkSgin; // 后台返回的值wx.config({debug: false, // 因为在⼿机上测试没法打印,当debug为true时,所有的返回值都会在⼿机上alert出来appId: sdkSign.appId, // 必填,公众号唯⼀标识timestamp: sdkSign.timestamp, // 必填,⽣成签名的时间戳nonceStr: sdkSign.nonceStr, // 必填,⽣成签名的随机串signature: sdkSign.signature,// 必填,签名jsApiList: ['chooseImage','uploadImage'] // 必填,需要使⽤的JS接⼝列表,需要⽤到什么接⼝就去开发者⽂档查看相应的字段名});});其中,sendAjax.weixin.getSdkSign 是我个⼈⾃⼰封装的ajax请求,不⽤多在意。
第三步,就是上传图⽚了,相信⼀般都是⼀个点击事件来调取微信的相册和摄像头功能。
在事件⽅法中按以下⽅式写wx.chooseImage({count: 1, // 最多可以选择的图⽚张数,默认9sizeType: ['original', 'compressed'], // original 原图,compressed 压缩图,默认⼆者都有sourceType: ['album', 'camera'], // album 从相册选图,camera 使⽤相机,默认⼆者都有success: function (res) {let localIds = res.localIds; // 返回选定照⽚的本地ID列表(⼿机上操作就是⼿机端的ID列表,是⼀个数组),localId可以作为img标签的src属性显⽰图⽚ wx.uploadImage({localId: localIds[0], // 需要上传的图⽚的本地ID,由chooseImage接⼝获得isShowProgressTips: 1, // 默认为1,显⽰进度提⽰success: function (result) {let serverId = result.serverId; // 返回图⽚的服务器端ID// 可以将serverId传给后台,⽤于存放在⾃⼰服务器上}});},fail: function() {},complete: function() {}});需要注意的是,chooseImage是调取微信相册和摄像头功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于图片上传到服务器并保存到数据库,然后读出显示到页面上的一系列例子.cn/s/blog_4b8712eb010007zx.html(2007-02-03 09:08:23)转载▼分类:JAVA一、addImg.jsp 类似网易邮箱的多附件上传,无刷新动态添加<%@ page language="java" contentType="text/html; charset=gbk"pageEncoding="gbk"import=",,,java.util.*"%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01Transitional//EN"><html><head><%String path = request.getContextPath();BookDAO bdao = new BookDAO();Book b = new Book();List booklist = bdao.findAll();if (booklist == null || booklist.size() == 0) { booklist = new ArrayList();}%><script>function addUploadFile(){var _table =document.getElementByIdx("uploadTable"); var rowIndex =_table.getElementsByTagName_r("tr").length -1;var _tr = _table.insertRow(rowIndex);var _td1 = _tr.insertCell(0);var _td2 = _tr.insertCell(1);var _td3 = _tr.insertCell(2);_tr.bgColor = '#E1E8F4';_tr.setAttribute("height","27");_tr.setAttribute("id",rowIndex.toString());_td1.setAttribute("width","15%");_td1.setAttribute("align","center");_td2.setAttribute("align","left");_td2.setAttribute("colspan","2");_td3.setAttribute("width","5%");var td1 = '图片';var td2 = '<input type="FILE"name="file'+rowIndex.toString()+'" size="20 " style="width:100%; font-size:12px; border:1px solid #555555;">';var td3 = '<input type="button"class="button"name="btnDel"'+rowIndex.toString()+' value="删除"onclick="delUploadFile('+rowIndex.toString( )+');">';_td1.appendChild(document.createTextNode(td1));_td2.appendChild(document.createElement(t d2));_td3.appendChild(document.createElement(t d3));}function delUploadFile(fileIndex){if (confirm('确定要删除么?')){var _table =document.getElementByIdx("uploadTable"); _table.deleteRow(document.getElementById x(fileIndex.toString()).rowIndex);}}function submitPage(){var form=document.getElementByIdx("form1");var flag=0;for(i=0;i<"input").length;i++){if("input")[i].type=="file"){if("input")[i].value==""){alert("请不要有空的上传文件框") flag=1;}}}if(flag==0){form.submit();}}</script></head><body><form name="form1" method="post" action="/TianaiSearch/UploadImage" ENCTYPE="multipart/form-data"><table width="100%" border="0" cellspacing="1" cellpadding="0"bgcolor="#869DD2"><tr><td><table id="uploadTable" width="100%" border="0" cellpadding="4" cellspacing="1" align="center" bgcolor="#ffffff"><tr><td height="40" colspan="2"><spanclass="style1 tt style1"><strong>上传文件信息</strong></span></td></tr><tr height="24" bgcolor="#EAEEF7"><td width="15%" align="center">对应文档</td><td align="left" colspan="2"><input type="text" name="file_id"size="20" style="width:100%; font-size:12px; border:1px solid #555555;"></tr><tr height="24" bgcolor="#EAEEF7"><td width="15%" align="center">来自书目</td><td align="left" colspan="2"><select name="book_id"><%for(int i=0;i<booklist.size();i++){b=(Book)booklist.get(i);%><optionvalue="<%=b.getId() %>"><%=b.getName() %></option><%}%></select></tr><tr height="24" bgcolor="#EAEEF7"><td width="15%" align="center">开始页码</td><td align="left" colspan="2"><input type="text"name="start_page_no" size="20"style="width:100%; font-size:12px; border:1px solid #555555;"></td></tr><tr height="27" bgcolor="#E1E8F4"><td width="15%" align="center">图片</td><td align="left" colspan="2"><input type="FILE"name="upload" size="20" style="width:100%;font-size:12px; border:1px solid #555555;"> </td></tr><tr bgcolor="#EAEEF7"><td colspan="4" align="center"><input type="button" class="button" name="addUpload" value="添加文件" onclick="addUploadFile();"> <input type="button" class="button" name="smtbtn" value="确认上传"onclick="submitPage();"> <input type="reset" class="button" name="bt4" value="重置"></td></tr></table></td></tr></table></form></body></html>二、UploadImage.servlet doPost方法//实例化上载beanmySmartUpload = new ;//初始化mySmartUpload.initialize(this.getServletCo nfig(),request,response);request.setCharacterEncoding("gbk");//设置上载的最大值mySmartUpload.setMaxFileSize(500 * 1024 * 1024);//上载文件try {mySmartUpload.upload();} catch (SmartUploadException e) {// TODO 自动生成catch 块e.printStackTrace();}//循环取得所有上载的文件for (int i = 0; i <mySmartUpload.getFiles().getCount(); i++) { //取得上载的文件myFile = mySmartUpload.getFiles().getFile(i);if (!myFile.isMissing()) {//取得上载的文件的文件名String myFileName =myFile.getFileName();//取得不带后缀的文件名String suffix = myFileName.substring(0, myFileName.lastIndexOf('.'));//取得后缀名String ext =mySmartUpload.getFiles().getFile(0).getFileExt();//取得文件的大小int fileSize = myFile.getSize();//保存路径String aa =getServletContext().getRealPath("/") + "jsp\\"; ;String trace = aa + myFileName;//取得别的参数// String explain = (String) mySmartUpload.getRequest()// .getParameter("text");// String send = (String) mySmartUpload.getRequest()// .getParameter("send");String sBook_id =(String)mySmartUpload.getRequest().getPara meter("book_id");"book id is "+sBook_id);int iBook_id = 0;if (sBook_id != null &&sBook_id.trim().length() != 0) {iBook_id = Integer.parseInt(sBook_id); }String sFile_id =(String)mySmartUpload.getRequest().getPara meter("file_id");"file_id is "+sFile_id);int iFile_id = 0;if (sFile_id != null &&sFile_id.trim().length() != 0) {iFile_id = Integer.parseInt(sFile_id);}String sStartPage_no =(String)mySmartUpload.getRequest().getPara meter("start_page_no");int iStartPage_no = 0;if (sStartPage_no != null && sStartPage_no.trim().length() != 0) {iStartPage_no =Integer.parseInt(sStartPage_no);}int iPage_no=0;if(iStartPage_no!=0){iPage_no=iStartPage_no+i;}//将文件保存在服务器端try {myFile.saveAs(trace, mySmartUpload.SAVE_PHYSICAL);} catch (SmartUploadException e) {e.printStackTrace();}//下面的是将上载的文件保存到数据库中//将文件读到流中file = new ;fis = newfile);;//打开数据库Image image = new Image(0, iFile_id, fis, iBook_id,iPage_no);ImageDAO idao = new ImageDAO();idao.add(image);}}}到此,图片就已经存进数据库了,接着看怎么把他显示到页面上三、showImage() servlet中使用private void ShowImage(String id, HttpServletRequest request,HttpServletResponse response) throws IOException {Connection conn = null;final String CONTENT_TYPE = "image/*"; ResultSet rs = null;Statement stmt = null;String SQLString = ""; // 定义查询语句String M_EorrMenage = ""; // 定义错误信息变量InputStream in = null; // 定义输入流int len = 10 * 1024 * 1024; // 定义字符数组长度// Initialize global variablesresponse.setContentType(CONTENT_TYP E);// PrintWriter out = response.getWriter(); try {SQLString = "select * from image where id=" + id;} catch (Exception e) {e.printStackTrace();response.setContentType("text/html; charset=gbk");M_EorrMenage = "请输入图片ID号"; M_EorrMenage = newString(M_EorrMenage.getBytes("ISO8859_1"), "GBK");// out.println("<%@ pagecontentType='text/html; charset=gbk' %>"); // out.println("<html>");//out.println("<head><title>id</title></head>"); // out.println("<body>");// out.println("<p>" + M_EorrMenage + "</p>");// out.println("</body></html>");}try {conn =DBConnection.newInstacne().getConnection( );stmt = conn.createStatement();rs = stmt.executeQuery(SQLString);} catch (SQLException ex) {"aq.executeUpdate:" + ex.getMessage());M_EorrMenage = "对不起,数据库无法完成此操作!";M_EorrMenage = newString(M_EorrMenage.getBytes("ISO8859_1 "), "GBK");response.setContentType("text/html; charset=gb2312");// out.println("<html>");//out.println("<head><title>no_database</title ></head>");// out.println("<body>");// out.println("<p>" + M_EorrMenage + "</p>");// out.println("</body></html>");}try {if (rs.next()) {in = rs.getBinaryStream("pic");response.reset(); // 返回在流中被标记过的位置response.setContentType("image/jpg"); // 或gif等// int len=in.available();//得到文件大小OutputStream toClient =response.getOutputStream();byte[] P_Buf = new byte[len];int i;while ((i = in.read(P_Buf)) != -1) {toClient.write(P_Buf, 0, i);}in.close();toClient.flush(); // 强制清出缓冲区\\rtoClient.close();} else {M_EorrMenage = "无此图片!";M_EorrMenage = newString(M_EorrMenage.getBytes("ISO8859_1 "),"GBK");response.setContentType("text/html;charset=gb2312");// out.println("<html>");// out// .println("<head><title>this photo isn\'t // have</title></head>");// out.println("<body>");// out.println("<p>" + M_EorrMenage + "</p>");// out.println("</body></html>");}rs.close();} catch (Exception e) {e.printStackTrace();M_EorrMenage = "无法读取图片!";M_EorrMenage = newString(M_EorrMenage.getBytes("ISO8859_1 "), "GBK");response.setContentType("text/html; charset=gb2312");// out// .println("<%@ pagecontentType=\'text/html; charset=gb2312\' // %>");// out.println("<html>");// out.println("<head><title>nophoto</title></head>");// out.println("<body>");// out.println("<p>" + M_EorrMenage + "</p>");// out.println("</body></html>");}try {conn.close();} catch (SQLException e) {e.printStackTrace();}}四、显示图片到页面上在任何想使用图片的页面上使用<img>标签,并把src指向显示图片用的servlet就可以PS:1.addImage 页面,form的ENCTYPE="multipart/form-data"必须这样设置才能正常使用jspSmartUpload组件进行上传,但是这样设置后,无法在下一个页面中通过request.getParameter()获取参数,只能通过mySmartUpload.getRequest().getParameter(p araName)进行参数的获取。