flex显示二进制图片的问题
这几天在用flex上传并显示头像的问题,在显示数据库中保存的图片的时候遇到了困难,在JAVA后台取到byte[]或者org.apache.axis.utils.ByteArray或者java.lang.Byte[]传递到前台转换为ByteArray的时候,总是报【1034 类型强制失败:无法将 _ 转换为 _ 】的错误。请各位大神帮帮忙,小弟感激不尽。其中报错的那一行我在代码里面标出来了,我不知道是我JAVA代码里面取的时候不对还是到flex前台转换的时候不对。
以下是代码:
JAVA:
DAO层:
public ByteArray loadImageBytes(long partyId) throws DAOException {
String sql = "select * from upload_file f, party p where p.file_url = f.file_id and p.party_id = 1000001";//测试,就没有取partyId,直接写了固定的
final List<ByteArray> list = new ArrayList<ByteArray>();
jdbcTemplate.query(sql, new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
java.sql.Blob blob = rs.getBlob("content");
ByteArray ba = new ByteArray();
InputStream inStream = blob.getBinaryStream();
try {
// 下面将BLOB数据写入文件
byte[] b = new byte[1024];
int len = 0;
while ((len = inStream.read(b)) != -1) {
ba.write(b, 0, len);
}
ba.flush();
} catch (Exception e) {} finally {
if (inStream != null)
try {
inStream.close();
} catch (IOException e) {}
if (ba != null)
try {
ba.close();
} catch (IOException e) {}
}
list.add(ba);
}
});
if (list.size() > 0)
return list.get(0);
return null;
}
service层:
public Map loadImageBytes(Map request) {
Map map = new HashMap();
try {
// Long partyId = Long.parseLong(getRequestValue(request,
// "partyId"));
Long partyId = 0l;
ByteArray ba = fm.loadImageBytes(partyId);
byte[] bas = ba.toByteArray();
Byte[] _bas = new Byte[bas.length];
for (int i = 0; i < _bas.length; i++) {
_bas[i] = new Byte(bas[i]);
}
map.put("file", ba);
map.put("ba", _bas);
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
flex:
command层:
public function execute(viewRef:*, request:Object):void
{
CursorManager.setBusyCursor();
this.viewRef=viewRef;
//TODO:下面要改成你要调用的服务和方法,service添加在ServiceLocator中
var service:AMF0Service=ServiceLocator.getInstance().getService(ServiceLocator.EOMS_ORG_STAFF_MANAGEMENT_SERVICE);
var pendingCall:AMF0PendingCall=service.loadImageBytes(request);
pendingCall.responder=new AMF0RelayResponder(this, "onResult", "onStatus");
}
public function onResult(result:*):void
{
CursorManager.removeBusyCursor();
viewRef.onLoadImageResult(result);
}
public function onStatus(faultObj:Object):void
{
CursorManager.removeBusyCursor();
ErrorView.showErrorView(faultObj);
}
flex
as层:
private function loadImage():void
{
var loadImageCommand:LoadImageCommand=new LoadImageCommand();
loadImageCommand.execute(this, new Object());
}
public function onLoadImageResult(result:Object):void
{
try
{
///////////////////////////////////////////////////////////////////////////////////
//就这步报错
var arrImage:ByteArray=ByteArray(result.ba);
//var arrImage:ByteArray=ByteArray(result.bas1);
//var arrImage:ByteArray=ByteArray(result.file);
///////////////////////////////////////////////////////////////////////////////////
image.loadBytes(arrImage);
}
catch (e:Error)
{
AlertFX.info(e.errorID + "");
}
}
image:
这个是在网上直接找到的:
package bss.components
{
import flash.display.Loader;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.system.LoaderContext;
import flash.utils.ByteArray;
import mx.controls.Image;
public class ByteArrayImage extends mx.controls.Image
{
private var _loader:Loader=new Loader();
private var _bFillUp:Boolean=false; //是/否平铺
public function Image():void
{
}
override protected function createChildren():void
{
addChild(_loader);
}
public function get bFillUp():Boolean
{
return _bFillUp;
}
public function set bFillUp(value:Boolean):void
{
this._bFillUp=value;
}
public function loadBytes(bytes:ByteArray, context:LoaderContext=null):void
{
try
{
_loader.loadBytes(bytes);
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onBytesLoaded);
_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);
createChildren();
}
catch (e:Error)
{
ToolTipPanel.show("加载出错!" + e.errorID);
}
}
private function onError(event:IOErrorEvent):void
{
ToolTipPanel.show("该类型的文件不支持预览!");
}
private function onBytesLoaded(e:Event):void
{
if (_bFillUp)
{
_loader.width=this.width;
_loader.height=this.height;
}
else
{
_loader.width=100;
_loader.height=100;
}
}
}
}
[解决办法]
不知道为什么强转失败,但是可以通过URLStream一边读一边往bytearray里面写,然后加载bytearray就可以了