话还得从头说起,因为这一段时间以来我们公司正在用ext来做后台的管理系统,而我做的那一块里面包含了一个照片上传的功能 ,
因为对ext还不是太熟,所以以为它其中的文件上传控件还要自己去重写它的控件,可没想到上一下它的论坛一搜,原来只要在控件
里面将其xtype设置为file,再将form里面的fileUpload设置为true就行了,这时以为问题解决了,就在action里面用String来接收上传
控件里面的内容,可是搞了大半天还是收不到啥东西,后来经师兄点醒才知道原来直接用file对象接收就行了(晕,当然,这不是ext
的问题,是我自己菜的原因)。
用file对象接收后我采用了一个同事的建议将其转化成字节流后存入一个字节数组然后再存入数据库,(因为对java中的图像操作不熟,所以也搞了一点时间,)
不过后来还是搞定了:
这是转化后保存的代码:
public void save() throws Exception
{
logger.debug("id:" + student.getId());
logger.debug("photo:" + (photoObj==null));
HashMap<String, Object> result = this.getDefaultMap();
List<Student> list = new ArrayList<Student>();
try
{
if(photoObj!=null)
{
logger.debug("here:");
BufferedImage img=ImageIO.read(photoObj);
int h = img.getHeight();
int w = img.getWidth();
byte[] data = new byte[h*w];
ByteArrayOutputStream out = new ByteArrayOutputStream();
BufferedImage dest = new BufferedImage(w, h,
BufferedImage.TYPE_3BYTE_BGR);
dest.getGraphics().drawImage(img, 0, 0, w, h, Color.WHITE,
null);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(dest);
data = out.toByteArray();
logger.debug("data.length:" + data.length);
student.setPhoto(data);
String outname="c:\\\\img3.jpg";
FileOutputStream fileoutputstream = new FileOutputStream(outname);
fileoutputstream.write(data);
fileoutputstream.close();
out.close();
studentManager.save(student);
list.add(student);
result.put(COUNT, 1);
result.put(LIST, 1);
}
}
catch (VersionException se)
{
result.put(SUCCESS, false);
result.put(MESSAGE, "该数据已被其他用户修改,请重新加载编辑窗口.");
}
catch (Exception se)
{
result.put(SUCCESS, false);
result.put(MESSAGE, "Error unknown.");
}
this.getResponse().flushBuffer();
outJson(result);
}
这里是读出到网页的代码:
public void image()
throws Exception {
String id=data.get("myid");
System.out.println("id:"+id);
if(id!=null)
{
Long lid=Long.valueOf(id);
//设置浏览器不缓存图片
this.getResponse().setHeader("Pragma","No-cache");
this.getResponse().setHeader("Cache-Control","no-cache");
this.getResponse().setDateHeader("Expires", 0);
this.getResponse().addHeader("Content-disposition", "inline" + "; filename=\"" + "safs.jpg" + "\"");
this.getResponse().setContentType("image/jpeg");
OutputStream os=this.getResponse().getOutputStream();
byte[] mybyte=studentManager.getObject(lid).getPhoto();
os.write(mybyte);
os.close();
}
else
{
logger.debug("This record there isn't photo!");
}
}
搞定后听另外一个同事说可以直接用一种叫Blob的类型来接收后直接写入数据库就行了,刚好那里要下班了所以就
没去试,不过后来回宿舍后自己试了一下,还真的可以,比先转化成字节流再写入来得直接点。不过因为我们用的pgsql数据库,不支持
Blob,所以我还是决定用bytea来存byte[]算了,以后有机会再用Blob来存吧,呵呵:
以下是我用mysql试验一下的代码:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class Dbtest {
private static final String URL = "jdbc:mysql://localhost:3306/jiejie?user=root&password=&useUnicode=true";
private Connection conn = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
private File file = null;
/**
* 向数据库中插入一个新的BLOB对象(图片)
* @param infile 要输入的数据文件
* @throws java.lang.Exception
*/
public void blobInsert(String infile) throws Exception
{
FileInputStream fis = null;
try
{
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
conn = DriverManager.getConnection(URL);
file = new File(infile);
fis = new FileInputStream(file);
pstmt = conn.prepareStatement("insert into tmp(descs,pic) values(?,?)");
pstmt.setString(1,file.getName()); //把传过来的第一个参数设为文件名
pstmt.setBinaryStream(2,fis,fis.available()); //第二个参数为文件的内容
pstmt.executeUpdate();
}
catch(Exception ex)
{
System.out.println("[blobInsert error : ]" + ex.toString());
}
finally
{
//关闭所打开的对像//
pstmt.close();
fis.close();
conn.close();
}
}
/**
* 从数据库中读出BLOB对象
* @param outfile 输出的数据文件
* @param picID 要取的图片在数据库中的ID
* @throws java.lang.Exception
*/
public void blobRead(String outfile,String picName) throws Exception
{
FileOutputStream fos = null;
InputStream is = null;
byte[] Buffer = new byte[4096];
try
{
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
conn = DriverManager.getConnection(URL);
pstmt = conn.prepareStatement("select pic from tmp where descs=?");
pstmt.setString(1,picName); //传入要取的图片的ID
rs = pstmt.executeQuery();
rs.next();
file = new File(outfile);
if(!file.exists())
{
file.createNewFile(); //如果文件不存在,则创建
}
fos = new FileOutputStream(file);
is = rs.getBinaryStream("pic");
int size = 0;
while((size = is.read(Buffer)) != -1)
{
//System.out.println(size);
fos.write(Buffer,0,size);
}
}
catch(Exception e)
{
System.out.println("[OutPutFile error : ]" + e.getMessage());
}
finally
{
//关闭用到的资源
fos.close();
rs.close();
pstmt.close();
conn.close();
}
}
public static void main(String[] args)
{
try
{
Dbtest blob = new Dbtest();
//blob.blobInsert("C:/jie1.jpg");
blob.blobRead("c:/1.jpg","jie.jpg");
}
catch(Exception e)
{
System.out.println("[Main func error: ]" + e.getMessage());
}
}
}
分享到:
相关推荐
Ext的入门示例代码!!!!!!!!!!!!!!!!!!!!
"ext内存泄露补丁文件"指的是EXTJS框架中针对内存泄露问题的修复补丁。EXTJS是一个流行的JavaScript库,用于构建富客户端应用程序,其组件化的设计使得开发者能够创建复杂的用户界面。然而,由于JavaScript的异步...
在"Ext上传文件例子"中,我们首先需要创建一个ExtJS的表单(`Ext.form.Panel`),其中包含一个文件域(`Ext.form.FileField`)。这个文件域允许用户选择文件,并在选择后触发一个事件,该事件可以用来提交表单或执行...
ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记ext2.0笔记...
标题中的“ext上传文件”可能指的是使用EXTJS(一个JavaScript库)进行文件上传的功能。EXTJS提供了一套完整的用户界面组件,其中包括文件上传组件,它允许用户在Web应用中方便地上传文件。EXTJS通常与后端服务器...
标题"ext4.0 多文件上传"指的是在ext4.0文件系统中实现的多文件同时上传功能。ext4.0是Linux操作系统中的一个高级文件系统,它在ext3的基础上进行了优化,提高了性能并支持更大的文件系统容量。多文件上传则是指用户...
Ext3.0是Linux操作系统中广泛使用的日志文件系统之一,它是Extended File System(Ext2)的增强版本,引入了日志记录功能,以提高系统的稳定性和数据完整性。这次发布的预览版,即Ext3.0 beta,为用户提供了一个提前...
在“Ext3.0实现多文件上传.rar”这个压缩包中,我们聚焦于一个特定的功能:使用Ext3.0来实现实时的多文件上传功能。这个功能通常在网页应用中用于让用户能够一次性上传多个文件,如图片、文档等,极大地提高了用户...
本示例“Ext上传文件 Demo”聚焦于如何使用Ext JavaScript库与ASP.NET后端相结合来实现文件上传。下面将详细阐述相关知识点。 首先,Ext是一个强大的JavaScript框架,用于构建富客户端应用程序。它提供了丰富的组件...
"Ext2.0 文件上传组件"是一个用于Web应用程序的组件,它允许用户在浏览器中方便地上传文件。这个组件基于Ext JavaScript库的2.0版本,Ext是一个强大的前端开发框架,提供了丰富的用户界面组件和数据管理功能。在本文...
总的来说,实现`Ext`中的文件上传进度显示涉及客户端与服务器端的协同工作。客户端利用`Ext.Ajax`发送带进度信息的异步请求,而服务器端使用`commons-fileupload`处理文件上传。通过这种方式,我们可以提供一个用户...
在EXT的文件批量上传中,主要涉及以下几个核心知识点: 1. **EXT组件**:EXT库中的Grid、FormPanel、FileInput等组件是实现批量上传的关键。Grid用于展示已选择的文件列表,FormPanel用于封装表单数据,FileInput则...
首先,EXTJS中的`Ext.form.Panel`组件是实现多文件上传的基础。我们需要创建一个包含`Ext.form.FileField`的表单,这是EXTJS中用于处理文件输入的组件。在`FileField`中,我们可以通过设置`multiple`属性为`true`来...
一个Ext的上传文件的控件。修改过的源码。能上传中文文件。
多文件上传是现代Web应用中的常见需求,EXT结合SWFUpload可以提供一个用户友好的文件上传界面,支持批量选择和上传。在EXT组件中嵌入SWFUpload,需要理解其API接口,例如设置上传参数、添加事件监听器等,同时还要...
Ext 文件上传参考文档主要涉及的是在Web开发中处理文件上传的场景,特别是使用ExtJS框架进行前端交互。ExtJS是一个强大的JavaScript库,用于构建复杂的、数据驱动的Web应用程序。文件上传是用户界面中的常见功能,...
在Android开发中,ext4文件系统打包是系统镜像制作的重要一环。本文档将详细介绍在Android平台上使用make_ext4fs工具打包ext4文件系统镜像的过程,并对相关的操作注意事项进行说明。同时,文档也会涉及使用simg2img...
”这个项目中,我们可以看到EXT2.0如何被用来创建一个后台管理系统的动态树结构,并结合了分页功能,以提高用户体验和系统性能。 动态树结构是EXT2.0中的一个重要特性,它允许用户交互地展开和折叠节点,以显示或...
Ext4文件系统在Ext3的基础之上做了很多改进,引入了大量新功能,这些改进主要是为了提高未来的Linux系统的性能。 虽然Ext4做了很多改进,但依然能够与Ext3实现向后和向前的兼容性,这一点的确很难得。 因为Ext3文件...
在Web开发中,文件上传是一项常见的功能,尤其在企业级应用和社交网络中更是不可或缺。ExtJS是一个强大的JavaScript库,提供了丰富的组件和功能,其中包括文件上传。本示例将详细介绍如何在ExtJS环境中实现文件上传...