我有一个flex程序(AS3 / Flash),允许用户创建舞台部分的PNG图像并通过电子邮件发送。这很有效。
我想拍摄相同的图像并将其发送到剪贴板,但这不起作用。因此,下一个最好的事情是允许他们将其发送到他们的浏览器,在那里他们可以将其保存到文件中。
以下是我用来执行该操作的代码;
bmpPanelData.draw(uiPrintObject)
var baPanel:ByteArray = PNGEnc.encode(bmpPanelData);
// Clipboard.generalClipboard.clear();
// var bolClipboard:Boolean = Clipboard.generalClipboard.setData(ClipboardFormats.BITMAP_FORMAT, baPanel, true);
// trace('bolClipboard=' + bolClipboard);
var strFileName:String = strPrintObject;
var strFileExt:String = "png"
var variables:URLVariables = new URLVariables();
variables.mimeType = "application/octet-stream";
variables.fileExt = strFileExt;
baPanel.position = 0;
var strPanel:String = getBytes(baPanel);
// var strPanel:String = baPanel.readMultiByte(baPanel.bytesAvailable,"latin1");
variables.fileContents = escape(strPanel);
trace('strPanel.length=' + strPanel.length + ' baPanel.length=' + baPanel.length);
variables.disposition = "Attachment";
variables.fileName = strFileName;
var u:URLRequest = new URLRequest( RootDomain + "SendBinaryFile2.aspx");
u.data = variables;
u.method = "POST";
navigateToURL(u,"_blank");
}
catch (err:Error)
{
Alert.show("This Panel cannot be copied to the clipboard. \nSorry for the inconvenience \nError: " + err.errorID,"E-mail not premitted",Alert.OK)
}
(我留下剪贴板的东西注释掉,以防有人知道怎么做。我的理解是你不能从Flash发送二进制数据到剪贴板,但它可以在AIR中工作。)
由于我找不到将二进制ByteArray转换为字符串的AS3方法,因此我编写了自己的getBytes。如果你知道AS3中的方法,请告诉我。
private function getBytes(baArray:ByteArray):String
{
var strOut:String = "";
baArray.position = 0;
var intBASize:int = baArray.bytesAvailable;
for (var i:int = 0;i < intBASize;i++)
{
strOut += String.fromCharCode(baArray.readByte());
}
return strOut;
}
在ASPX方面,我有一个名为SendBinaryFile2.aspx的文件,看起来像这样;
<%@ Page Language="C#" validateRequest="false"%>
<script Runat="Server">
void Page_Load(Object sender, EventArgs e)
{
string fileExt = Request.Form["fileExt"];
string mimeType = Request.Form["mimeType"];
string disposition = Request.Form["disposition"];
string fileName = Request.Form["fileName"];
byte [] fileContents = Encoding.ASCII.GetBytes(HttpUtility.UrlDecode(Request.Form["fileContents"]));
Response.Buffer = true;
Response.Clear();
Response.AddHeader("Content-Length", fileContents.Length.ToString());
Response.ContentType = mimeType;
Response.AddHeader("Content-Disposition", disposition + "; filename=" + fileName + "." + fileExt);
Response.BinaryWrite(fileContents);
Response.Flush();
Response.Close();
Response.End();
}
</script>
结果是一个看起来很像.PNG文件的文件,但在打开时会损坏。我直观地比较了通过电子邮件发送的文件和使用VIM通过该程序发送的文件,它们看起来相似,字符数大致相同,开头/结尾的字符类似。
非常感谢上面定义的任何项目的帮助。
答案 0 :(得分:2)
请尝试使用此getBytes
功能...
private function getBytes (baArray:ByteArray) : String
{
var strOut:String = ""; var strRead:String = "";
baArray.position = 0;
var intBASize:uint = baArray.length;
for (var i:int = 0; i < intBASize; i++)
{
strRead = baArray.readUnsignedByte().toString(16);
if(strRead.length < 2) { strRead = "0" + strRead; } //# do padding
strOut += strRead ;
}
return strOut.toUpperCase();
}
这应该给你填充字节。考虑x0FF3
只是xFF3
没有填充,后来另一方可能假设字节真的是xFF30
导致损坏的图像。
答案 1 :(得分:1)
我建议您使用Base64编码来传输二进制数据。无论如何,您必须使用它来编码电子邮件附件。
的ActionScript: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/utils/Base64Encoder.html
C#:
byte[] textAsBytes = System.Convert.FromBase64String(encodedText);
此外,如果您的SWF作为独立AIR运行(您编写了&#34; Flex程序&#34; ...),您可以直接将文件保存在任何位置并为用户提供&#34;另存为... &#34;提示这样做。
从AIR保存的来源:
var bmpd:BitmapData = new BitmapData(myWidth, myHeight, true, 0);
bmpd.draw(mySource);
var imgByteArray:ByteArray = new PNGEncoder().encode(bmpd);
var fl:File = File.desktopDirectory.resolvePath("myImage.png");
var fs:FileStream = new FileStream();
fs.open(fl, FileMode.WRITE);
fs.writeBytes(imgByteArray);
fs.close();