Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从base64编码字符串将文件解码为流。怎么做?_Javascript_Html_Delphi_Delphi Xe4 - Fatal编程技术网

Javascript 从base64编码字符串将文件解码为流。怎么做?

Javascript 从base64编码字符串将文件解码为流。怎么做?,javascript,html,delphi,delphi-xe4,Javascript,Html,Delphi,Delphi Xe4,我有一个字符串,由我的应用程序从web浏览器接收。字符串包含PNG图像,并编码为base64 这不是我愚蠢的想法,将图像转换为base64字符串)来实现web broser。 HTML5画布对象,当需要将图像发送到某个地方时 那么,如何将这个字符串解码成图像呢 我用Delphi编写了我的web服务器,它接收数据 在PHP中,这可以通过以下方式解决: 但在delphi中,解码后: if (sImg <> EmptyStr) then begin Coder := TId

我有一个字符串,由我的应用程序从web浏览器接收。字符串包含PNG图像,并编码为base64

这不是我愚蠢的想法,将图像转换为base64字符串)来实现web broser。 HTML5画布对象,当需要将图像发送到某个地方时

那么,如何将这个字符串解码成图像呢

我用Delphi编写了我的web服务器,它接收数据

在PHP中,这可以通过以下方式解决:

但在delphi中,解码后:

  if (sImg <> EmptyStr) then
  begin
    Coder := TIdDecoderMIME.Create(nil);
    MS := TMemoryStream.Create;
    try
      Coder.DecodeStream(sImg, MS);
      MS.SaveToFile(myDir + '1.png');
    finally
      FreeAndNil(MS);
      FreeAndNil(Coder);
    end;
  end;

我的web服务器接收以下数据:

  if (ARequestInfo.Document = '/addurl') then
  begin
    Id := ARequestInfo.Params.Values['Owner'];
    sName := ARequestInfo.Params.Values['Name'];
    sDesc := ARequestInfo.Params.Values['Desc'];
    sURL := ARequestInfo.Params.Values['URL'];
    sImg := ARequestInfo.Params.Values['Img'];
    RootLI := nil;
    LinksManager.FindByID(Id, RootLI);
    if Assigned(RootLI) then
    begin
      LI := TLinkItem.Create(nil);
      LI.name := sName;
      LI.Description := sDesc;
      LI.URL := sURL;
      if (sImg <> EmptyStr) then
      begin
        MS := TMemoryStream.Create;
        SS := TStringStream.Create(sImg);
        try
          DecodeStream(SS, MS);
          MS.SaveToFile(myDir + '1.png');
        finally
          FreeAndNil(MS);
          FreeAndNil(SS);
        end;
      end;
      RootLI.Add(LI, True);
      AResponseInfo.ResponseText := 'OK';
    end
    else
      AResponseInfo.ResponseText := 'FAIL';
  end;
如果(ARequestInfo.Document='/addurl'),那么
开始
Id:=ARequestInfo.Params.Values['Owner'];
sName:=ARequestInfo.Params.Values['Name'];
sDesc:=ARequestInfo.Params.Values['Desc'];
sURL:=ARequestInfo.Params.Values['URL'];
sImg:=ARequestInfo.Params.Values['Img'];
RootLI:=零;
LinksManager.FindByID(Id,RootLI);
如果分配(RootLI),则
开始
LI:=TLinkItem.Create(无);
LI.name:=sName;
LI.说明:=sDesc;
LI.URL:=sURL;
如果(sImg EmptyStr)那么
开始
MS:=TMemoryStream.Create;
SS:=TStringStream.Create(sImg);
尝试
解码流(SS,MS);
MS.SaveToFile(myDir+'1.png');
最后
FreeAndNil(MS);
FreeAndNil(SS);
结束;
结束;
RootLI.Add(LI,True);
AResponseInfo.ResponseText:=“确定”;
结束
其他的
AResponseInfo.ResponseText:=“失败”;
结束;

在所有这些之后,我得到了一个只包含黑色的图像。

我用另一种方法解决了我的问题。 在JS中,我通过标头(Ajax.setRequestHeader)发送数据,并在POST流中发送文件。 在那个解码流之后,从EncdDecd正确工作,我从string得到了图像

        Id := ARequestInfo.RawHeaders.Values['OwnerId'];
        sName := ARequestInfo.RawHeaders.Values['Name'];
        sDesc := ARequestInfo.RawHeaders.Values['Desc'];
        sURL := ARequestInfo.RawHeaders.Values['URL'];
...
          if (ARequestInfo.PostStream <> nil) then //We have the image!
          begin
            MS := TMemoryStream.Create;
            MS2 := TMemoryStream.Create;
            try
              MS2.LoadFromStream(ARequestInfo.PostStream);
              DecodeStream(MS2, MS);
              MS.SaveToFile(myDir + '1.png');
            finally
              FreeAndNil(MS);
              FreeAndNil(MS2);
            end;
          end;
Id:=ARequestInfo.RawHeaders.Values['OwnerId'];
sName:=ARequestInfo.RawHeaders.Values['Name'];
sDesc:=ARequestInfo.RawHeaders.Values['Desc'];
sURL:=ARequestInfo.RawHeaders.Values['URL'];
...
如果(ARequestInfo.PostStream nil),那么//我们有了图像!
开始
MS:=TMemoryStream.Create;
MS2:=TMemoryStream.Create;
尝试
MS2.LoadFromStream(ARequestInfo.PostStream);
解码流(MS2,MS);
MS.SaveToFile(myDir+'1.png');
最后
FreeAndNil(MS);
FreeAndNil(MS2);
结束;
结束;

您还可以尝试混合使用可选的多部分/表单数据编码。但是Indy没有实现用于解析这种格式的接收数据的类

你试过什么,什么不起作用?有大量的资源在那里解释如何做到这一点,这里还有一些关于堆栈溢出的资源。你应该做你的研究,只有当你被难倒时才在这里提问。我现在编辑了我的问题。更好的是,现在这是一个足够的问题。在中提到,你需要去掉
数据:image/png;base64,
。这个字符串是您输入流的一部分吗?如果是,你也这样做了吗?如果没有,您如何接收这些数据;如何下载该流?您的内容的编码是什么?现在你的问题中有很多细节缺失@Jerry,现在我们有证据证明Alexandr试图编写代码,但我们需要主要获得关于输入流的信息。@TLama比最初的想法好得多实际上,Indy确实有一个解码类
multipart/…
data-
TIdMessageDecoderMIME
。它最初不打算与
TIdHTTPServer
一起使用,只用于电子邮件,但它可以与
TIdHTTPServer
一起使用,并进行一些手动编码。这方面的例子以前已经发布过很多次了,所以请四处搜索。MIME解析将在Indy 11中进一步扩展和推广,包括
TIdHTTPServer
中对解析
多部分/表单数据的内置支持。但与此同时,TIdMessageDecoderMIME已经足够了。Indy 11不存在,甚至还没有启动。目前的版本是10.6。您现在必须使用
tidmessagedecodermie
var Img = capture().toDataURL();
var Img = Img.replace('data:image/png;base64,','');

     if (FLA.AddNewURL(sN,sD,sU,sI,Img)) {
      window.close();
     } else {
      alert('can not establish connection!');
     };
AddNewURL: function (aName, aDesc,sURL, aOwnerId,aImg) {
    var http = new XMLHttpRequest();
    var params = 'Owner=' + aOwnerId + '&Name=' + aName + '&Desc=' + aDesc+ '&URL=' + sURL;
    if (aImg) {
      params = params +'&Img='+aImg;
    };
        http.open("POST", "http://" + this.host + ":" + this.port + "/addurl", false);
        http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
        http.send(params);
    return (http.status === 200);
},
  if (ARequestInfo.Document = '/addurl') then
  begin
    Id := ARequestInfo.Params.Values['Owner'];
    sName := ARequestInfo.Params.Values['Name'];
    sDesc := ARequestInfo.Params.Values['Desc'];
    sURL := ARequestInfo.Params.Values['URL'];
    sImg := ARequestInfo.Params.Values['Img'];
    RootLI := nil;
    LinksManager.FindByID(Id, RootLI);
    if Assigned(RootLI) then
    begin
      LI := TLinkItem.Create(nil);
      LI.name := sName;
      LI.Description := sDesc;
      LI.URL := sURL;
      if (sImg <> EmptyStr) then
      begin
        MS := TMemoryStream.Create;
        SS := TStringStream.Create(sImg);
        try
          DecodeStream(SS, MS);
          MS.SaveToFile(myDir + '1.png');
        finally
          FreeAndNil(MS);
          FreeAndNil(SS);
        end;
      end;
      RootLI.Add(LI, True);
      AResponseInfo.ResponseText := 'OK';
    end
    else
      AResponseInfo.ResponseText := 'FAIL';
  end;
        Id := ARequestInfo.RawHeaders.Values['OwnerId'];
        sName := ARequestInfo.RawHeaders.Values['Name'];
        sDesc := ARequestInfo.RawHeaders.Values['Desc'];
        sURL := ARequestInfo.RawHeaders.Values['URL'];
...
          if (ARequestInfo.PostStream <> nil) then //We have the image!
          begin
            MS := TMemoryStream.Create;
            MS2 := TMemoryStream.Create;
            try
              MS2.LoadFromStream(ARequestInfo.PostStream);
              DecodeStream(MS2, MS);
              MS.SaveToFile(myDir + '1.png');
            finally
              FreeAndNil(MS);
              FreeAndNil(MS2);
            end;
          end;