如何解决使用Java下载时APK损坏,但浏览器下载正常
我正在尝试下载服务器上托管的APK。通过浏览器下载时,它可以正常工作。我得到14MB。但是当使用Java下载时,APK似乎已损坏,因为下载的APK仅有189kb。以下是使用Apache Commons FileUtils下载时的代码:
URL格式类似于https://example.com/emm.apk。在浏览器中输入此URL即可直接下载APK,而不会出现问题。
URL url = new URL("https://example.com/emm.apk");
File file = new File(UUID.randomUUID().toString() +"-"+ FilenameUtils.getName(fileUrl.getPath()));
FileUtils.copyURLToFile(url,file,50_000,50_000);
我还尝试了Java内置的文件IO:
URLConnection conn = url.openConnection();
int contentLength = conn.getContentLength();
DataInputStream stream = new DataInputStream(url.openStream());
byte[] buffer = new byte[contentLength];
stream.readFully(buffer);
stream.close();
DataOutputStream fos = new DataOutputStream(new FileOutputStream(file));
fos.write(buffer);
fos.flush();
fos.close();
对于该特定网址,我只会遇到此问题。我无法查明出了什么问题,因为我无法访问主机服务器。显然问题在于APK的托管方式。是否有关于如何配置托管APK的服务器的要求?我碰到了application/vnd.android.package-archive
,主机服务器需要吗?为什么浏览器(Chrome)可以毫无问题地下载它,而我的Java代码却没有?
解决方法
APK的主机服务器似乎正在根据User-Agent
请求标头阻止请求,这就是为什么浏览器下载可以的原因,但在不同介质中下载时却不是。
我尝试手动设置User-Agent
中的URLConnection
,并且下载正确。
URLConnection connection = fileUrl.openConnection();
connection.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/41.0.2228.0 Safari/537.36");
InputStream input = connection.getInputStream();
FileUtils.copyInputStreamToFile(input,file);
189kb
是一个HTML文件,表明请求被拒绝。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。