0
我正在开发一个文件管理器Android应用程序,它通过POST方法将base64编码文件发送到Web服务器。在服务器端,cgi perl脚本获取字符串,解码并保存到文件中。问题是无法建立套接字连接,并且Apache访问日志中没有数据条目。请分享任何想法,以下是源代码:通过HTTP和POST发送查询字符串的Android应用程序
“i”是类Item的对象 - 即从文件管理器中选择的文件。
Item i = adapter.getItem(position); 我正在将“我”传递给sendFile方法。
private void sendFile(Item i) {
try {
File inFile;
DataInputStream dis;
String queryString, encodedData, headerPart1, headerPart2, dataBundle;
byte[] fileData;
int contentLength;
String host = "192.168.100.2";
inFile = new File(i.getPath());
fileData = new byte[(int) inFile.length()];
dis = new DataInputStream(new FileInputStream(i.getPath()));
dis.readFully(fileData);
dis.close();
encodedData = Base64.encodeToString(fileData, Base64.NO_WRAP);
AccountManager accountManager = AccountManager
.get(getBaseContext());
Account account = getAccount(accountManager);
queryString = account.name + "^" + i.getName() + "^" + encodedData;
headerPart1 = "POST /cgi-bin/grabber.cgi HTTP/1.1\r\n" + "Host: "
+ host + "\r\n" + "User-Agent: Tposter\r\n"
+ "Content-Length: ";
headerPart2 = "Content-Type: text/plain\r\n"
+ "Accept-Charset: UTF-8\r\n\r\n";
contentLength = queryString.length();
dataBundle = headerPart1 + contentLength + "\r\n" + headerPart2
+ queryString;
// Create file uploader thread
FileUploader fileUploader = new FileUploader(dataBundle);
fileUploader.start();
Toast.makeText(this, "File sent!", Toast.LENGTH_LONG).show();
finish();
} catch (Exception e) {
Log.e("send ERROR in file FileChooser.class ", e.getMessage());
}
}
FileUploader.java
public class FileUploader extends Thread {
PrintWriter printWriter;
SocketAddress sockAddr;
Socket socket;
int port = 80;
String host = "192.168.100.2";
public FileUploader(String dataBundle) {
try {
sockAddr = new InetSocketAddress(host, port);
socket = new Socket();
socket.setSoTimeout(3000);
socket.connect(sockAddr, 5000);
if (socket.isConnected()) {
Log.w("Connected! ", dataBundle);
printWriter = new PrintWriter(new OutputStreamWriter(
socket.getOutputStream()));
printWriter.println(dataBundle);
printWriter.flush();
printWriter.close();
socket.close();
}
} catch (IOException e) {
Log.e("socket ERROR in file fileUploader.class ", e.getMessage());
}
}
}
[调试截图]:(http://postimg.org/image/6upsjregb/)
为什么你会使用套接字做基于REST通信时,[机器人有自带的几个HTTP客户端(http://android-developers.blogspot.co.nz/2011/09/androids-http- clients.html)? – panini
为什么你base64编码文件数据?我建议按原样发送原始文件数据。为了帮助实现这个目的,将'account.name'移动到一个自定义的HTTP头,比如'X-AccountName',并将'i.getName()'移动到'Content-Type'头的'name'参数。然后,您可以使用HTTP 1.1的'Transfer-Encoding:chunked'头文件(并省略Content-Length头文件),以便可以读取并发送原始文件数据块以减少内存使用量,并且不会将整个文件读入记忆了。 –
我正在对文件进行编码以便通过HTTP发送二进制文件,但请专注于此问题。我会尝试HTTP客户端。谢谢。 – X0rrify