Я пытаюсь загрузить файл pdf на свой мобильный телефон (используя Java ME
), используя SocketConnection
Api. Идея состоит в том, чтобы отправить серверу запрос HTTP GET
, и он ответит данными с файлом PDF. Однако проблема, с которой я сталкиваюсь, заключается в том, что сервер сначала отвечает обратно строковыми данными (HTTP Headers
), а затем двоичными данными. Я просто хочу хранить двоичные данные (файл PDF).
Я написал этот код до сих пор, и он отлично работает, если сервер отвечает с помощью строковых данных. Однако, когда он отвечает обратно с двоичными данными, этот код все еще пытается сохранить все как строку, правильно сохраняя первоначально возвращенные HTTP Headers
(не обязательные) и затем искаженные биты, соответствующие двоичным данным моего файла PDF.
public void FileDownload() {
try {
sc = (SocketConnection) Connector.open("socket://" + hostname + ":" + port);
OutputStream os = sc.openOutputStream();
os.write(("GET " + link_to_file_to_be_downloaded + " HTTP/1.0\r\n").getBytes("UTF-8"));
os.write(("HOST: " + hostname + "\r\n").getBytes("UTF-8"));
os.write(("\r\n").getBytes("UTF-8"));
os.flush();
os.close();
String url = "file:///E:/Data/" + "binary_data.pdf";
FileConnection fconn = (FileConnection) Connector.open(url, Connector.READ_WRITE);
if (!fconn.exists()) {
fconn.create();
}
OutputStream ops = fconn.openOutputStream();
byte data = 0;
in = sc.openInputStream();
data = (byte) in.read();
while (data != -1) {
ops.write(data);
data = (byte) in.read();
}
ops.flush();
ops.close();
fconn.close();
} catch (IOException ex) {
parent_class.main_form.append("Exception occured while "
+ "downloading file: " + ex.toString() + "\n");
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ex) {
parent_class.main_form.append("Exception occured while "
+ "downloading file: " + ex.toString() + "\n");
}
}
}
}
Это то, что хранится в файле "binary_data.pdf" с использованием этого кода -
HTTP/1.1 200 OK
Date: Sun, 25 Mar 2012 07:03:10 GMT
Server: Apache/2.2.14 (Ubuntu)
Last-Modified: Tue, 20 Mar 2012 22:00:45 GMT
ETag: "420050-12bad-4bbb3ce85fd21"
Accept-Ranges: bytes
Content-Length: 76717
Content-Type: application/pdf
Via: 1.0 www.XXX.XXX.org
Connection: close
%PDF-1.4
%????
3 0 obj <<
/Length 4077
/Filter /FlateDecode
>>
stream
x??ZYs?6~????9U.?#??Udg?M*qYJ???T-4?fq? @Z????<FT?}
lt7??n???_???4?s???????"
3????<???^?V?z??M?z??m?^????V???o??S'm6?????.??/Sx??Y?av?MB?*b^?f??/?IO??B??q??/?(??aT?a?@#??,?%???Z8? ?]??-?\?]??????nw?2?;?????Z?;?[}??????&J=ml??-??V?|??:??"?(?Gf??D??~?QW?U?Z???cP?b???QX
(Эта операция может быть проще при использовании верхнего уровня HttpConnection
API, но я хочу понять, как все работает на самом базовом уровне, и поэтому вместо этого я использую SocketConnection
API.)
Короче говоря, я хочу, чтобы мое приложение просто интерпретировало данные, отвечаемые сервером правильно, как строковые или двоичные, и затем соответственно сохраняло двоичный файл (возможно, отбрасывая строковые заголовки HTTP).