首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > flex >

flex显示二进制图片的有关问题

2013-01-11 
flex显示二进制图片的问题这几天在用flex上传并显示头像的问题,在显示数据库中保存的图片的时候遇到了困难

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就可以了

热点排行