【问题标题】:How can I send a binary file from actionScript to .net?如何将二进制文件从 actionScript 发送到 .net?
【发布时间】:2016-03-30 12:54:49
【问题描述】:

我有一个 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 通过该程序发送的文件,它们看起来相似,字符数大致相同,以相似的字符开头/结尾。

非常感谢您对上述任何项目的帮助。

【问题讨论】:

  • 你可以尝试转换成base64字符串。查看更多here:
  • 我希望我的回答有帮助,但为什么发送到浏览器只是为了保存文件?我的意思是您可以使用FileReference 类直接将文件保存在 AS3 中。
  • VC.One 我给了你答案,但我实际上使用了 FileReference。我以前从未使用过它,但它似乎正是我所需要的。如果有人需要,我实际上可以让它以另一种方式工作并提供我的结果。
  • 很高兴它已排序。是的,只需使用 fileReference 保存baPanel(PNG 编码后)即可为您提供磁盘上的图像。少麻烦吗? PS:使用@符号给用户通知,否则我会错过你的评论。谢谢

标签: c# asp.net actionscript-3 flash apache-flex


【解决方案1】:

为您的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 导致图像损坏。

【讨论】:

  • VC.One 这将返回一个包含字符串的十六进制值的字符串,而不是实际的二进制字符串。我假设我会从“variables.fileContents = escape(strPanel);”行中删除“escape”。我在 C# 端使用什么来将一串十六进制字符转换为实际的二进制数据?
  • 您希望格式为“零和一”而不是十六进制吗?让我知道因为该格式的填充代码不同。如果将其保留为十六进制,则在复制到剪贴板之前进行 base64 编码,然后浏览器可以将 base64 解码为可显示的图像。
【解决方案2】:

我建议您使用 Base64 编码来传输您的二进制数据。无论如何,您肯定已经需要使用它来编码您的电子邮件附件。

动作脚本: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/utils/Base64Encoder.html

c#:

byte[] textAsBytes = System.Convert.FromBase64String(encodedText);

此外,如果您的 SWF 作为独立 AIR 运行(您编写了“Flex 程序”...),您可以直接将文件保存在任何地方,并为用户提供“另存为...”提示。

要从 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 2015-10-24
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    相关资源
    最近更新 更多