1

我能够使用 Renesas Synergy S7 微控制器实现嵌入式 Web 服务器。服务器代码在 C 中,我使用了 Synergy TCP 堆栈,它是 Netx Duo 和 Net Secure(用于 TLS)。该项目的目标是使用浏览器将文件从 PC 传输到 S7,S7 将这些文件存储在 SD 卡中。我能够使用 chrome 和使用 HTTP 的 edge 成功地做到这一点。我使用网络安全 TLS 堆栈转换为 HTTPS。我可以显示我的网页,但我的文件传输无法在 chrome 上运行。它可以在边缘工作,但块大小限制为大约 250 字节。使用 HTTP,我可以为两个浏览器的每个块传输 1024 个字节。无论如何,我在这里主要关心的是如何使用 Chrome 来处理这个问题,但如果你也可以为我提供一个解决方案来增加 Edge 的块大小,那将是一个很大的帮助。

我已经研究过 CORS,但我认为这与它无关,因为它都来自同一个起源。此外,浏览器不会发送任何启动它的标头。

//这是我用来传输文件的代码。oBlob 包含块 //这里是 oBlob 的示例

var fd = new FormData();
oBlob = new Blob(["```", fileName, "$", size, "$", x, "$",  partFile, "***", crc16, "$"]);
fd.append("my-file", oBlob);
xhr.open("POST", "/Upload/", true);
xhr.responseType = 'text';
xhr.send(fd);

//下面是处理来自 S7 的响应的 javascript 代码。

xhr.onreadystatechange = function() {
      if (xhr.readyState === 4 && xhr.status === 200) {
      var response = xhr.responseText;
      console.log(response);
      if(x < numLoops && response === "OK\0" && sendFlag === 1)
      {
        PartitionFile();
      }
      else if(response === "RESEND\0" && sendFlag === 1)
      {
        ResendFile();
      }
      else
      {
        SelectFile();
      }
    }
  };//end xhr.onreadystatechange

我发送了一个带有字母的文本文件,这就是我从 Chrome 中得到的:文本文件的内容没有发送。当我检查源代码时,当我将光标悬停在 x 标记上方时,我在 xhr.send(fd) 上的 javascript 代码中也看到了一个错误。错误是加载资源失败:net::ERR_EMPTY_RESPONSE

=====================================================
Message from client...
POST /Upload/ HTTP/1.1
Host: 1.2.3.4
Connection: keep-alive
Content-Length: 268
Origin: https://1.2.3.4
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36   (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryA8KHeWAlLzwyGQQL
Accept: */*
Referer: https://1.2.3.4/File_Transfer.html?File+Transfer=File+Transfer
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

Number of bytes received = 494
=====================================================
=====================================================

下面是我从 Edge 收到的内容(如您所见,文本文件已发送,使用 HTTP 时使用 Chrome 会得到相同的结果。)

=====================================================
Message from client...
POST /Upload/ HTTP/1.1
Origin: https://1.2.3.4
Referer: https://1.2.3.4/File_Transfer.html?  File+Transfer=File+Transfer
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36  (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134
Content-Type: multipart/form-data; boundary=---------------------------7e33012f20668
Accept: */*
Accept-Language: en-US
Accept-Encoding: gzip, deflate, br
Host: 1.2.3.4
Content-Length: 272
Connection: Keep-Alive
Cache-Control: no-cache

-----------------------------7e33012f20668
Content-Disposition: form-data; name="my-file"; filename="blob"
Content-Type: application/octet-stream

```TestFile.txt$43$1$AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEE***16322$
-----------------------------7e33012f20668--

Number of bytes received = 798
=====================================================

如果您将 oBlob 与文本文件输出进行比较,您将看到数据包是如何形成的。

看起来 Chrome 在使用 SSL/TLS 时阻止发送文件内容。我也尝试了 fetch 而不是 xhr 并且仍然是相同的结果。请帮我解决这个问题。

谢谢。周杰伦

4

0 回答 0