Ext中的文件上传笔记,呵呵!

话还得从头说起,因为这一段时间以来我们公司正在用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());
}
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在EXT.js实现上传文件功能,可以使用Ext.form.Panel和Ext.form.field.File组件。具体步骤如下: 1. 创建一个Ext.form.Panel组件,设置属性和方法。 ```javascript var formPanel = Ext.create('Ext.form.Panel', { renderTo: Ext.getBody(), width: 400, height: 150, title: '上传文件', bodyPadding: 10, frame: true, url: 'upload.php', //上传文件处理的URL method: 'POST', //上传文件的方式 items: [{ xtype: 'filefield', //上传文件的组件 name: 'file', //上传文件的参数名 fieldLabel: '选择文件', labelWidth: 70, msgTarget: 'side', allowBlank: false, buttonText: '浏览...' }], buttons: [{ text: '上传', handler: function() { var form = this.up('form').getForm(); if (form.isValid()) { form.submit({ success: function(form, action) { Ext.Msg.alert('成功', action.result.msg); }, failure: function(form, action) { Ext.Msg.alert('失败', action.result.msg); } }); } } }] }); ``` 2. 创建一个Ext.form.field.File组件,用于选择要上传的文件。 ```javascript { xtype: 'filefield', name: 'file', fieldLabel: '选择文件', labelWidth: 70, msgTarget: 'side', //错误提示的位置 allowBlank: false, //是否允许为空 buttonText: '浏览...' //选择文件按钮的文本 } ``` 3. 在表单添加按钮,用于提交表单数据。 ```javascript { xtype: 'button', text: '上传', handler: function() { var form = this.up('form').getForm(); if (form.isValid()) { //验证表单是否合法 form.submit({ //提交表单数据 success: function(form, action) { Ext.Msg.alert('成功', action.result.msg); }, failure: function(form, action) { Ext.Msg.alert('失败', action.result.msg); } }); } } } ``` 4. 在服务端处理上传文件。 在上面的代码,上传文件处理的URL为'upload.php',需要在该文件处理上传的文件,将文件保存到服务器上。具体代码如下: ```php <?php $targetDir = "uploads/"; //上传文件保存的目录 $targetFile = $targetDir . basename($_FILES["file"]["name"]); //上传文件的路径 $uploadOk = 1; $imageFileType = strtolower(pathinfo($targetFile,PATHINFO_EXTENSION)); //文件类型 //检查文件是否已经存在 if (file_exists($targetFile)) { echo json_encode(array('msg' => '文件已经存在')); $uploadOk = 0; } //检查文件大小 if ($_FILES["file"]["size"] > 5000000) { // 5MB echo json_encode(array('msg' => '文件太大')); $uploadOk = 0; } //检查文件类型 if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) { echo json_encode(array('msg' => '只允许上传jpg、png、jpeg和gif格式的文件')); $uploadOk = 0; } //上传文件 if ($uploadOk == 0) { echo json_encode(array('msg' => '上传失败')); } else { if (move_uploaded_file($_FILES["file"]["tmp_name"], $targetFile)) { echo json_encode(array('msg' => '文件上传成功')); } else { echo json_encode(array('msg' => '上传失败')); } } ?> ``` 以上就是在EXT.js实现上传文件功能的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值