Просмотр файла и загрузка его на сервер через сокет
Я разрабатываю приложение, которое позволяет пользователю найти файл в хранилище (внутреннем / внешнем) и загрузить его на серверный сокет java.
Спасибо.
Вот мой код выбора файла
public String fileChooser() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(Intent.createChooser(intent, "Choose Your File"), 1);
}
Приложение продолжает падать..... что я делаю не так? Хорошо, я понял, что приложение зависало, потому что я пытался вернуть URI в самом методе. Затем я изменил его так, чтобы его можно было получить, когда пользователь выбирает файл из средства выбора.
Однако теперь я размещаю Socket-сервер, который получит файл (любой текстовый / мультимедийный файл) и сохранит его в определенном каталоге.
Мой получатель выглядит следующим образом:
public void step1()
{
File theDir = new File("C://ServerFiles");
if (!theDir.exists()) {
try{
theDir.mkdir();
} catch(SecurityException se){
areaStatus.append("error creating file \n");
}
}
try {
InetAddress IP=InetAddress.getLocalHost();
lblIp.setText("IP:"+IP.toString());
} catch (UnknownHostException ex) {
Logger.getLogger(ServerConfig.class.getName()).log(Level.SEVERE, null, ex);
}
try {
areaStatus.append("ServerRunning.... \n");
String SPort;
SPort = txtport.getText();
Serverport =Integer.parseInt(SPort);
serverSocket = new ServerSocket(Serverport);
ClientSocket=serverSocket.accept();
areaStatus.append("Connected With"+ClientSocket.getInetAddress().toString()+"\n");
input = ClientSocket.getInputStream();
BufferedReader inReader = new BufferedReader(new InputStreamReader(ClientSocket.getInputStream()));
BufferedWriter outReader = new BufferedWriter(new OutputStreamWriter(ClientSocket.getOutputStream()));
filename = inReader.readLine();
if ( !filename.equals("") ){
outReader.write("READY\n");
outReader.flush();
}
} catch (IOException ex) {
Logger.getLogger(ServerConfig.class.getName()).log(Level.SEVERE, null, ex);
}
areaStatus.append("Client connected \n");
}
public void step2()
{
byte[] buffer;
buffer= null;
FileOutputStream wr = null;
try {
wr = new FileOutputStream(new File("C://ServerFiles/" + filename));
try {
buffer = new byte[ClientSocket.getReceiveBufferSize()];
} catch (SocketException ex) {
Logger.getLogger(ServerConfig.class.getName()).log(Level.SEVERE, null, ex);
}
int bytesReceived = 0;
try {
while((bytesReceived = input.read(buffer))>0)
{
/* Write to the file */
wr.write(buffer,0,bytesReceived);
}
} catch (IOException ex) {
Logger.getLogger(ServerConfig.class.getName()).log(Level.SEVERE, null, ex);
}
try {
wr.close();
} catch (IOException ex) {
Logger.getLogger(ServerConfig.class.getName()).log(Level.SEVERE, null, ex);
}
areaStatus.append("Transfer completed \n");
} catch (FileNotFoundException ex) {
Logger.getLogger(ServerConfig.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
wr.close();
} catch (IOException ex) {
Logger.getLogger(ServerConfig.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
step1();
}
}
}
Я работаю над отправителем файла, который я опубликую, как только закончу.
Это мой отправитель файла, но он показывает Ошибка "Файл не найден":
private class Fileuploader extends AsyncTask<Void, Void, Integer> {
protected void onPreExecute() {
}
protected Integer doInBackground(Void... params) {
Socket sk;
try {
sk = new Socket("192.168.0.108", 1131);
File myFile = new File(filepathString);
byte[] mybytearray = new byte[(int) myFile.length()];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
bis.read(mybytearray, 0, mybytearray.length);
OutputStream os = sk.getOutputStream();
os.write(mybytearray, 0, mybytearray.length);
os.flush();
sk.close();
} catch (IOException e) {
e.printStackTrace();
}
return 1;
}
protected void onPostExecute(Integer result) {
}
}
Мой журнал АБР:
04-22 13:23:14.269 8355-8385/envoyone.ak.ace.fileud I/OpenGLRenderer﹕ Initialized EGL, version 1.4
04-22 13:23:14.299 8355-8385/envoyone.ak.ace.fileud D/OpenGLRenderer﹕ Enabling debug mode 0
04-22 13:23:16.860 8355-8355/envoyone.ak.ace.fileud W/IInputConnectionWrapper﹕ showStatusIcon on inactive InputConnection
04-22 13:23:24.745 8355-8387/envoyone.ak.ace.fileud W/System.err﹕ java.io.FileNotFoundException: content:/com.android.externalstorage.documents/document/primary%3Atext%2Fmessenger_dndictionary.xml: open failed: ENOENT (No such file or directory)
04-22 13:23:24.757 8355-8387/envoyone.ak.ace.fileud W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:456)
04-22 13:23:24.757 8355-8387/envoyone.ak.ace.fileud W/System.err﹕ at java.io.FileInputStream.<init>(FileInputStream.java:76)
04-22 13:23:24.757 8355-8387/envoyone.ak.ace.fileud W/System.err﹕ at envoyone.ak.ace.fileud.FileUpload$Fileuploader.doInBackground(FileUpload.java:98)
04-22 13:23:24.757 8355-8387/envoyone.ak.ace.fileud W/System.err﹕ at envoyone.ak.ace.fileud.FileUpload$Fileuploader.doInBackground(FileUpload.java:78)
04-22 13:23:24.757 8355-8387/envoyone.ak.ace.fileud W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:288)
04-22 13:23:24.757 8355-8387/envoyone.ak.ace.fileud W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
04-22 13:23:24.757 8355-8387/envoyone.ak.ace.fileud W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
04-22 13:23:24.759 8355-8387/envoyone.ak.ace.fileud W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
04-22 13:23:24.759 8355-8387/envoyone.ak.ace.fileud W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
04-22 13:23:24.759 8355-8387/envoyone.ak.ace.fileud W/System.err﹕ at java.lang.Thread.run(Thread.java:818)
04-22 13:23:24.759 8355-8387/envoyone.ak.ace.fileud W/System.err﹕ Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
04-22 13:23:24.760 8355-8387/envoyone.ak.ace.fileud W/System.err﹕ at libcore.io.Posix.open(Native Method)
04-22 13:23:24.760 8355-8387/envoyone.ak.ace.fileud W/System.err﹕ at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
04-22 13:23:24.760 8355-8387/envoyone.ak.ace.fileud W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:442)
04-22 13:23:24.760 8355-8387/envoyone.ak.ace.fileud W/System.err﹕ ... 9 more
04-22 13:23:54.924 8355-8355/envoyone.ak.ace.fileud W/IInputConnectionWrapper﹕ showStatusIcon on inactive InputConnection
1 ответ
Элементы галереи - это просто изображения и видео. У вас есть несколько вариантов здесь.
1) Используйте другое приложение, чтобы выбрать файл
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent, PICKFILE_RESULT_CODE);
Откроется список приложений, которые могут просматривать файлы. Файл может быть выбран из этого интерфейса
2) Используйте Storage Access Framework. Это похоже на пункт 1. Но интерфейс предоставляется самим Android. Прочитайте больше
3) Используйте File
Объект для доступа к каталогу внешнего хранилища. Следующее разрешение должно быть добавлено в манифест
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Затем следующее даст объект файла, указывающий на основной каталог внешнего хранилища, из которого можно получить доступ ко всей файловой системе.
File file = new File(Environment. getExternalStorageDirectory ());
Примечание: не смущайтесь словом "внешний" здесь. Этот каталог лучше всего рассматривать как носитель / общее хранилище. Это файловая система, которая может содержать сравнительно большой объем данных и совместно используется всеми приложениями (не применяет разрешения). Традиционно это SD-карта, но она также может быть реализована как встроенное хранилище в устройстве, которое отличается от защищенного внутреннего хранилища и может быть смонтировано как файловая система на компьютере.
Чтобы получить доступ к файлам со съемной карты microSD, следуйте этому ответу