从Web服务器获取后,为什么我的二进制数据更大?

Phi*_*p B 0 python java django byte file

我需要通过在Python/Django中实现的Web服务来提供二进制文件.问题是,当我将原始文件与传输的文件与vbindiff进行比较时,我看到传输文件上的尾随字节,遗憾地使它无用.

二进制文件由客户端在Java中保存,具有:

HttpURLConnection userdataConnection = null;
    URL userdataUrl = null;
    try {
        userdataUrl = new URL("http://localhost:8000/app/vuforia/10");

        userdataConnection = (HttpURLConnection) userdataUrl.openConnection();
        userdataConnection.setRequestMethod("GET");
        userdataConnection.setRequestProperty("Content-Type", "application/octet-stream");
        userdataConnection.connect();

        InputStream userdataStream = new BufferedInputStream(userdataConnection.getInputStream());
        try (ByteArrayOutputStream fileStream = new ByteArrayOutputStream()) {
            byte[] buffer = new byte[4094];
            while (userdataStream.read(buffer) != -1) {
                fileStream.write(buffer);
            }
            byte[] fileBytes = fileStream.toByteArray();
            try (FileOutputStream fos = new FileOutputStream("./test.dat")) {
                fos.write(fileBytes);
            }
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

我认为HttpURLConnection.getInputStream只读取响应的主体,或不?

此代码用于后端中的数据

在views.py中:

if request.method == "GET":
    all_data = VuforiaDatabase.objects.all()
    data = all_data.get(id=version)
    return FileResponse(data.get_dat_bytes())
Run Code Online (Sandbox Code Playgroud)

在models.py中:

def get_dat_bytes(self):
    return self.dat_upload.open()
Run Code Online (Sandbox Code Playgroud)

如何以1:1的方式传输二进制数据?

VGR*_*VGR 5

您忽略了InputStream.read的返回值.

文档:

返回:

读入缓冲区的总字节数,如果由于已到达流末尾而没有更多数据,则返回-1.

您的代码假设缓冲区充满了每次调用userdataStream.read(buffer),而不是检查实际读入的字节数buffer.

您根本不需要从InputStream中读取.只需使用Files.copy:

Path file = Paths.get("./test.dat");

try (InputStream userdataStream = new BufferedInputStream(userdataConnection.getInputStream())) {
    Files.copy(userdataStream, file, StandardCopyOption.REPLACE_EXISTING);
}
Run Code Online (Sandbox Code Playgroud)