对于我的项目,我需要使用java从谷歌驱动器下载pdf文件 我得到了我的httpresponse代码200,并使用以下方法将其存储在abc.pdf文件中
String url = "https://docs.google.com/uc?id="+fileid+"&export=download";
URL obj = new URL(url);
HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
// optional default is GET
conn.setRequestMethod("GET");
//add request header
conn.setRequestProperty("User-Agent", USER_AGENT);
int responseCode = conn.getResponseCode();
System.out.println("\nSending 'GET' request to URL : " + url);
System.out.println("Response Code : " + responseCode);
BufferedReader in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String inputLine;
OutputStream f0 = new FileOutputStream("C:\\Users\\Darshil\\Desktop\\abc.pdf",true);
while ((inputLine = in.readLine()) != null) {
//System.out.println(inputLine);
byte b[]=inputLine.getBytes();
//System.out.println(b);
f0.write(b);
}
in.close();
f0.close();
但是当我尝试在我的adobe reader x中打开abc.pdf时,我得到以下错误:
There was an error opening this document.The file is damaged and could not be repaired
答案 0 :(得分:1)
您似乎使用原始HTTP请求直接访问Google云端硬盘。
您可能更擅长使用Google Drive SDK。 This link包含很好的示例,可以解决您在问题中说明的用例。
但是,如果您确实想坚持自己的技术,那么就不应该使用BufferedReader.readLine()
。这是因为PDF文件最终是二进制文件,它取决于要保留的正确字节序列,以便PDF阅读器软件正确读取。希望以下技术可以帮助您:
//read in chunks of 2KB
byte[] buffer = new byte[2048];
int bytesRead = 0;
try(InputStream is = conn.getInputStream())
{
try(DataOutputStream os = new DataOutputStream(new FileOutputStream("file.pdf"))
{
while((bytesRead = is.read(buffer)) != -1)
{
os.write(buffer, 0, bytesRead);
}
}
}
catch(Exception ex)
{
//handle exception
}
请注意,我在Java 7中使用try-with-resources语句
希望这有帮助。