Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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
内容长度设置不正确时下载java文件?_Java_Android - Fatal编程技术网

内容长度设置不正确时下载java文件?

内容长度设置不正确时下载java文件?,java,android,Java,Android,我有一个android应用程序,可以在运行时下载并使用文件。该文件是有效的,因为我可以通过浏览器下载并打开它,等等。但是我的应用程序不断报告该文件已损坏 经过调查,我发现服务器(我无法控制)返回了不正确的“内容长度”(~180 vs~120000)。头部是罪魁祸首,因为我通过下载带有curl的文件确认了这个问题,这也导致了文件被截断 经过一些研究,我得出结论,我使用BufferedInputStream将ByteArrayBuffer附加到ByteArrayBuffer是将字节数组自动调整为ur

我有一个android应用程序,可以在运行时下载并使用文件。该文件是有效的,因为我可以通过浏览器下载并打开它,等等。但是我的应用程序不断报告该文件已损坏

经过调查,我发现服务器(我无法控制)返回了不正确的“内容长度”(~180 vs~120000)。头部是罪魁祸首,因为我通过下载带有curl的文件确认了这个问题,这也导致了文件被截断

经过一些研究,我得出结论,我使用
BufferedInputStream
ByteArrayBuffer
附加到
ByteArrayBuffer
是将字节数组自动调整为url连接内容长度。为了避免这种情况,我尝试使用
ByteArrayOutputStream
,但这并没有解决任何问题

如果内容长度设置不正确,有人知道下载文件的方法吗?浏览器可以

以下是我的最新尝试:

public static void downloadFileFromRemoteUrl(String urlString, String destination){
    try {
        URL url = new URL(urlString);
        File file = new File(destination);
        URLConnection urlConnection = url.openConnection();
        InputStream inputStream = urlConnection.getInputStream();
        byte[] buffer = new byte[1024];
        int curLength = 0;
        int newLength = 0;
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        while((newLength = inputStream.read(buffer))>0)
        {
            curLength += newLength;
            byteArrayOutputStream.write(buffer, 0, newLength);
        }
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(byteArrayOutputStream.toByteArray());
        fos.close();
        android.util.Log.d("DB UPDATE", "Done downloading database. Size: " + byteArrayOutputStream.toByteArray().length);
    }
    catch (MalformedURLException e) {
        e.printStackTrace();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}

试着去拿。Fetch是Android的应用内下载管理器。它很容易使用。找到GitHub页面。该项目附带了几个演示,您可以试用。免责声明:我是Fetch的创建者,它是开源的

尝试获取。Fetch是Android的应用内下载管理器。它很容易使用。找到GitHub页面。该项目附带了几个演示,您可以试用。免责声明:我是Fetch的创建者,它是开源的

经过一些研究,我得出结论,我使用
BufferedInputStream
ByteArrayBuffer
附加到
ByteArrayBuffer
是将字节数组自动调整为url连接内容长度

胡说八道。你认为这些职业有超自然的力量。输出流如何可能知道内容长度头?
URLConnection
的输入流将在内容长度处终止。没错

为了避免这种情况,我尝试改用ByteArrayOutputStream,但这并没有解决任何问题

当然不是

如果内容长度设置不正确,有人知道下载文件的方法吗

您可以使用
套接字
,自己参与HTTP,这比听起来要简单得多。但是问题出在服务器上,这是应该解决的地方。抱怨。或者@Zong Yu是正确的,页面是包含JavaScript的HTML,比如说

注意:您不需要将整个文件读入内存:

while((newLength = inputStream.read(buffer))>0)
{
    curLength += newLength;
    fos.write(buffer, 0, newLength);
}
经过一些研究,我得出结论,我使用
BufferedInputStream
ByteArrayBuffer
附加到
ByteArrayBuffer
是将字节数组自动调整为url连接内容长度

胡说八道。你认为这些职业有超自然的力量。输出流如何可能知道内容长度头?
URLConnection
的输入流将在内容长度处终止。没错

为了避免这种情况,我尝试改用ByteArrayOutputStream,但这并没有解决任何问题

当然不是

如果内容长度设置不正确,有人知道下载文件的方法吗

您可以使用
套接字
,自己参与HTTP,这比听起来要简单得多。但是问题出在服务器上,这是应该解决的地方。抱怨。或者@Zong Yu是正确的,页面是包含JavaScript的HTML,比如说

注意:您不需要将整个文件读入内存:

while((newLength = inputStream.read(buffer))>0)
{
    curLength += newLength;
    fos.write(buffer, 0, newLength);
}
我最后的“解决方案”是意识到我处理的是301重定向响应,而不是实际的资源!我更新了处理我的url的部分,检查301,如果存在,更新url。新的url包含与我正在下载的文件对应的内容长度

// start by creating an http url connection object
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

// determine if this is a redirect
boolean redirect = false;
int status = httpURLConnection.getResponseCode();
if (status != HttpURLConnection.HTTP_OK) {
    if (status == HttpURLConnection.HTTP_MOVED_TEMP
            || status == HttpURLConnection.HTTP_MOVED_PERM
            || status == HttpURLConnection.HTTP_SEE_OTHER)
        redirect = true;
}

// if it is, we need a new url
if (redirect) {
    String newUrl = httpURLConnection.getHeaderField("Location");
    httpURLConnection = (HttpURLConnection) new URL(newUrl).openConnection();
}
我最后的“解决方案”是意识到我处理的是301重定向响应,而不是实际的资源!我更新了处理我的url的部分,检查301,如果存在,更新url。新的url包含与我正在下载的文件对应的内容长度

// start by creating an http url connection object
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

// determine if this is a redirect
boolean redirect = false;
int status = httpURLConnection.getResponseCode();
if (status != HttpURLConnection.HTTP_OK) {
    if (status == HttpURLConnection.HTTP_MOVED_TEMP
            || status == HttpURLConnection.HTTP_MOVED_PERM
            || status == HttpURLConnection.HTTP_SEE_OTHER)
        redirect = true;
}

// if it is, we need a new url
if (redirect) {
    String newUrl = httpURLConnection.getHeaderField("Location");
    httpURLConnection = (HttpURLConnection) new URL(newUrl).openConnection();
}

那不太可能。浏览器还取决于内容长度。可能URL并没有真正指向该文件;相反,它是一个以某种方式嵌入文件的HTML页面。我让服务器修复内容长度错误:P
ByteArrayOutputStream
。去掉字节数组输出流,直接写入FileOutputStream。你不需要中间的东西。但这不是解决你问题的办法。只是更好的编码。你打开文件看看它是否是html吗?那不太可能。浏览器还取决于内容长度。可能URL并没有真正指向该文件;相反,它是一个以某种方式嵌入文件的HTML页面。我让服务器修复内容长度错误:P
ByteArrayOutputStream
。去掉字节数组输出流,直接写入FileOutputStream。你不需要中间的东西。但这不是解决你问题的办法。只是更好的编码。你打开文件看看它是否是html吗?但它真的忽略了内容长度吗?如果是这样,为什么?@EJP Fetch实际上只使用内容长度来恢复暂停的下载。但是如果你直接下载一个文件,它不会使用内容长度。很难相信。(a) 为什么??(b)它如何知道文件的结尾在哪里?它是否关闭了HTTP keepalive?内容长度与恢复暂停的下载有什么关系?@EJP服务器多次返回内容长度-1,文件下载成功。Content-Length标头仅提供内容的大小,并可用于请求文件数据的一部分。我们现在仍有许多旧服务器在运行,它们甚至不返回内容长度,但您可以从中成功下载。打开与服务器的连接并获取输入后,您只需读取它,直到服务器不返回任何内容。这时你就知道它完成了。我们讨论的内容长度是180左右,而不是-1。A C