我用二进制流写了图片上传保存到数据库,首页如何接收传递过来的参数显示图片在jsp页面
首先你这个思路就错误了,任何企业开发都不会把图片的二进制保存到数据库,图片太大,数据库会很快就满了,都是把图片保存到服务器的一个路径下,
例如tomcat的一个路径下面,然后把路径保存到数据库,这样去页面的时候就通过路径访问tomcat下面的图片就可以了。
查询数据库用
java类里面用new String(Content)
jsp页面用${Content}
建议存图片路径
非要存二进制可以考虑,先在目录创建图片文件,给页面返回这个图片路径
写一个action 或servlet 调用方法查出图片数据,然后生成图片文件,返回路径
可以用aJax请求 或者 标签 标签
示例
请求另一个action , 并使用返回结果
<s:action name="find_data" var="findData" namespace="/user"
ignoreContextParams="true" executeResult="false" />
<body background="${findData.imageSrc}" ></body>
find_data 为一个Action 或Servlet , findData 为 这个类实例的引用 imageSrc为这个类的一个成员属性要有get set
还有种方法 你喜欢你可以去试试
图片二进制上传与显示
/*
import java.util.ArrayList;
import java.util.List;
import utils.interceptor.LoginAdminInterceptor;
import com.alibaba.fastjson.JSONObject;
import com.jfinal.aop.Before;
import com.jfinal.upload.UploadFile;
import com.xiaheng.annotation.RouteViewPath;
import com.xiaheng.core.jfinal.CRUD;
import com.xiaheng.utils.CodeBean;
import com.xiaheng.utils.ProjectUtil;
import com.xiaheng.utils.UploadUtils;
/**
@since 2016年12月22日
*/
@Before(LoginAdminInterceptor.class)
@RouteViewPath("admin/")
public class FileloadController extends CRUD {
@Override
public String route() {
// TODO Auto-generated method stub
return "/admin/file";
}
/**
/**
/**
/**
不知道你解决了没有
前台代码:src中存放?前面放Servlet请求或者Action请求 ?后面放查询图片的参数(例如aaa=123,多个参数用& 连接例如src="testServlet?a=132&b=456")
<img src="testServlet?[XXXXX=?]" alt="">
//resp 是HttpServletResponse对象 blob(java.sql.Blob;)是从数据库中存放的blob数据查询出来的结果
//下面是主要的代码,不知道你在数据库中存储的是什么格式的数据
OutputStream os = resp.getOutputStream();
InputStream is = blob.getBinaryStream();
byte[] image == new byte[is.available()];
is.read(image);
os.write(image);
os.flush();
确实不能这样做,做动态刷新,就是一个js的事,动态发送获取图片的请求,而登陆界面用的图片数量有限,应保存在项目路径下,如果图片很多则建立图片管理服务器,其存取图片的方式也不是把图片流存入数据库的。
支持 rabbit 的说法,图片名称路径固定就好了,上传图片直接把原来的覆盖就OK了;
保险一点就先备份原来的,再覆盖。
把图片存放在数据库,
你们脑洞是得多大才能想到用这个方式,
先不说数据你要放在jsp页面上需要的是图片文件的物理路径,
不说数据库存储量是否足够你如此挥霍,
单是你每次都要把图片先读取出来先要处理才能使用想想就麻烦。
你何不数据库里存放图片路径,直接取路径然后传到页面上呢。
如果是在数据库读出来的,可以通过写一个方法,将图片写出。页面就用
如果是直接在数据库存的图片地址,从数据库读取到地址,页面就用
如果方法不会写,你告诉你用的是什么框架技术,我给你贴出来
给你范例;
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJAQMAAADaX5RTAAAAA3NCSVQICAjb4U/gAAAABlBMVEX///+ZmZmOUEqyAAAAAnRSTlMA/1uRIrUAAAAJcEhZcwAACusAAArrAYKLDVoAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDkvMjAvMTIGkKG+AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAAB1JREFUCJljONjA8LiBoZyBwY6BQQZMAtlAkYMNAF1fBs/zPvcnAAAAAElFTkSuQmCC" />
这样太麻烦,而且效率不好。不如把图片当做普通的文件,把路径存在数据库中,查数据库查出路径,在jsp就可以显示啊。更换背景图片,其实就是更换路径。
给你给我的demo吧,我使用的bootstrap-fileinput,前台效果如图
<div class="htmleaf-container" style="width:60%;display: none;">
<div class="container kv-main">
<form enctype="multipart/form-data" style="width:60%;background:#ccff99;position:absolute;top: 1%;left: 20%;z-index:1000;">
<div class="form-group">
<input id="file-4" type="file" name="file" class="file" multiple class="file-loading">
</div>
<hr>
<!-- <div class="form-group">
<button class="btn btn-warning" type="button">Disable Test</button>
<button class="btn btn-info" type="reset">Refresh Test</button>
<button class="btn btn-primary">Submit</button>
<button class="btn btn-default" type="reset">Reset</button>
</div>-->
</form>
</div>
</div>
$("#file-4").fileinput({
uploadUrl: 'uploadBackgroundImage.htm?employeeCode=$currentUserTool.getCurrentUserName()', // you must set a valid URL here else you will get an error
allowedFileExtensions : ['jpg', 'png','gif'],
overwriteInitial: false,
showCaption:false,
showUpload: false, // hide upload button
showRemove: false, // hide remove button
maxFileSize: 900,
maxFilesNum: 1,
}).on("filebatchselected", function(event, files) {
$("#file-4").fileinput("upload");
}).on('filebatchuploadcomplete', function() {
refresh();
});
function refresh(){
window.location.reload();
}
@RequestMapping("uploadBackgroundImage")
@ResponseBody
public String uploadBackgroundImage(ModelMap model, @RequestParam("file") MultipartFile file, EmployeePhotoModel query) throws IOException {
List<EmployeePhotoModel> list = null;
try {
list = employeePhoto.queryEmployeePhoto(query);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if (list.size() <= 0) {
query.setEmployeeCode(CurrentUserUtil.getCurrentUserName());
employeePhoto.insert(query);
}
byte[] bytes = file.getBytes();
query.setBackGroundImage(bytes);
try {
long r = employeePhoto.updateBackGroundImage(query);
} catch (Exception e) {
e.printStackTrace();
}
return "true";
}
/**
* 读取上传的图片
*
* @param employeeCode
* @param response
* @param request
* @param model
* @throws ServletException
* @throws IOException
* @throws SQLException
*/
@RequestMapping(value = "showUploadImage")
public void showUploadImage(@RequestParam("employeeCode") String employeeCode, HttpServletResponse response, HttpServletRequest request,
ModelMap model) throws ServletException, IOException, SQLException {
if (!StringUtil.isEmpty(employeeCode)) {
Map map = employeePhoto.getBackgroundId(employeeCode); // 获取背景图片
if (map != null && map.size() > 0) {
BLOB blob = (BLOB) map.get("BACKGROUNDIMAGE");
byte[] bytes = blob.getBytes(1L, (int) blob.length());
response.setContentType("image/jpeg, image/jpg, image/png, image/gif");
InputStream in1 = new ByteArrayInputStream(bytes);
IOUtils.copy(in1, response.getOutputStream());
}
}
String logoRealPathDir = request.getSession().getServletContext().getRealPath("/img/background.jpg");
InputStream is = new FileInputStream(logoRealPathDir);
IOUtils.copy(is, response.getOutputStream());
}
.contain{border:1px solid white;border-radius: 8px;background:url(showUploadImage.htm?employeeCode=$currentUserTool.getCurrentUserName());background-size: cover; } //前台展示的时候直接把背景的url替换成后台的方法就行
核心代码已给出,供参考
你数据库的图片有个id,然后你后台提供一个方法(url),参数就是图片的Id,通过这个方法返回图片数据到前台就可以了。
正常来说,企业网页处理文件上传问题的思路是通过解析文件然后先将文件复制到服务器端,然后将上传的文件的路径和文件名放在一个表中,然后在需要的时候后台获取文件名及文件路径,然后通过el表达式前台写到想要放置的标签下的路径属性里就好了
将图片的路径保存在数据库的表中,然后用的时候取出来,全部取出来,然后循环便利