浏览文件并通过套接字将其上传到服务器
Browsing for a file and uploading it to server through socket
我正在开发一个应用程序,使用户能够浏览存储(内部/外部)中的文件并将其上传到 java Serversocket。
谢谢。
这是我的文件选择器代码
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);
}
应用程序不断崩溃.....我做错了什么?
好吧,我发现应用程序崩溃了,因为我试图在方法本身中使用 return URI。然后我修改了它,以便用户从选择器中选择文件时可以获取它。
但是现在我正在托管一个套接字服务器,它将接收文件(任何文件文本/多媒体)并将其存储到特定目录中。
我的收件人如下:
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();
}
}
}
我正在处理文件发件人我会在完成后立即post。
这是我的文件发件人,但显示找不到文件错误:
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) {
}
}
我的 ADB 日志:
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.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.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)使用其他应用选择文件
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent, PICKFILE_RESULT_CODE);
这将打开可以浏览文件的应用列表。可以从该界面选择一个文件
2) 使用存储访问框架。和第1点类似,但是接口是android自己提供的。 Read more
3)使用File
对象访问外部存储目录。必须在清单中添加以下权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
那么下面会给出一个文件对象,指向主要的外部存储目录,从这个目录可以访问整个文件系统。
File file = new File(Environment. getExternalStorageDirectory ());
Note: don't be confused by the word "external" here. This directory can better be thought as media/shared storage. It is a filesystem that can hold a relatively large amount of data and that is shared across all applications (does not enforce permissions). Traditionally this is an SD card, but it may also be implemented as built-in storage in a device that is distinct from the protected internal storage and can be mounted as a filesystem on a computer.
要访问可移动 microSD 卡中的文件,请遵循 this 回答
我正在开发一个应用程序,使用户能够浏览存储(内部/外部)中的文件并将其上传到 java Serversocket。
谢谢。
这是我的文件选择器代码
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);
}
应用程序不断崩溃.....我做错了什么? 好吧,我发现应用程序崩溃了,因为我试图在方法本身中使用 return URI。然后我修改了它,以便用户从选择器中选择文件时可以获取它。
但是现在我正在托管一个套接字服务器,它将接收文件(任何文件文本/多媒体)并将其存储到特定目录中。
我的收件人如下:
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();
}
}
}
我正在处理文件发件人我会在完成后立即post。
这是我的文件发件人,但显示找不到文件错误:
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) {
}
}
我的 ADB 日志:
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.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.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)使用其他应用选择文件
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent, PICKFILE_RESULT_CODE);
这将打开可以浏览文件的应用列表。可以从该界面选择一个文件
2) 使用存储访问框架。和第1点类似,但是接口是android自己提供的。 Read more
3)使用File
对象访问外部存储目录。必须在清单中添加以下权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
那么下面会给出一个文件对象,指向主要的外部存储目录,从这个目录可以访问整个文件系统。
File file = new File(Environment. getExternalStorageDirectory ());
Note: don't be confused by the word "external" here. This directory can better be thought as media/shared storage. It is a filesystem that can hold a relatively large amount of data and that is shared across all applications (does not enforce permissions). Traditionally this is an SD card, but it may also be implemented as built-in storage in a device that is distinct from the protected internal storage and can be mounted as a filesystem on a computer.
要访问可移动 microSD 卡中的文件,请遵循 this 回答