内容长度设置不正确时下载java文件?
我有一个android应用程序,可以在运行时下载并使用文件。该文件是有效的,因为我可以通过浏览器下载并打开它,等等。但是我的应用程序不断报告该文件已损坏 经过调查,我发现服务器(我无法控制)返回了不正确的“内容长度”(~180 vs~120000)。头部是罪魁祸首,因为我通过下载带有curl的文件确认了这个问题,这也导致了文件被截断 经过一些研究,我得出结论,我使用内容长度设置不正确时下载java文件?,java,android,Java,Android,我有一个android应用程序,可以在运行时下载并使用文件。该文件是有效的,因为我可以通过浏览器下载并打开它,等等。但是我的应用程序不断报告该文件已损坏 经过调查,我发现服务器(我无法控制)返回了不正确的“内容长度”(~180 vs~120000)。头部是罪魁祸首,因为我通过下载带有curl的文件确认了这个问题,这也导致了文件被截断 经过一些研究,我得出结论,我使用BufferedInputStream将ByteArrayBuffer附加到ByteArrayBuffer是将字节数组自动调整为ur
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页面。我让服务器修复内容长度错误:PByteArrayOutputStream
。去掉字节数组输出流,直接写入FileOutputStream。你不需要中间的东西。但这不是解决你问题的办法。只是更好的编码。你打开文件看看它是否是html吗?但它真的忽略了内容长度吗?如果是这样,为什么?@EJP Fetch实际上只使用内容长度来恢复暂停的下载。但是如果你直接下载一个文件,它不会使用内容长度。很难相信。(a) 为什么??(b)它如何知道文件的结尾在哪里?它是否关闭了HTTP keepalive?内容长度与恢复暂停的下载有什么关系?@EJP服务器多次返回内容长度-1,文件下载成功。Content-Length标头仅提供内容的大小,并可用于请求文件数据的一部分。我们现在仍有许多旧服务器在运行,它们甚至不返回内容长度,但您可以从中成功下载。打开与服务器的连接并获取输入后,您只需读取它,直到服务器不返回任何内容。这时你就知道它完成了。我们讨论的内容长度是180左右,而不是-1。A C