文件上传不起作用android

Posted

技术标签:

【中文标题】文件上传不起作用android【英文标题】:File upload not working android 【发布时间】:2017-10-06 11:38:11 【问题描述】:

我有如下文件上传功能:

    public void uploadFile(Context context, File file) 
        String urlServer = "https://u-database.000webhostapp.com/recieve_file.php";
        if(file.isFile() && file.exists()) 
            String fileName = file.getAbsolutePath();
            try 
                HttpURLConnection conn = null;
                DataOutputStream dos = null;
                String lineEnd = "\r\n";
                String twoHyphens = "--";
                String boundary = "*****";
                int bytesRead, bytesAvailable, bufferSize;
                byte[] buffer;
                int maxBufferSize = 1 * 1024 * 1024;
                Toast toastw = Toast.makeText(context, "Inside TRY", Toast.LENGTH_SHORT);
                toastw.show();

                FileInputStream fileInputStream = new FileInputStream(file);
                URL url = new URL(urlServer);

                // Open a HTTP  connection to  the URL
                conn = (HttpURLConnection) url.openConnection();
                conn.setDoInput(true); // Allow Inputs
                conn.setDoOutput(true); // Allow Outputs
                conn.setUseCaches(false); // Don't use a Cached Copy
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Connection", "Keep-Alive");
                conn.setRequestProperty("ENCTYPE", "multipart/form-data");
                conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
                conn.setRequestProperty("textLog", fileName);

                dos = new DataOutputStream(conn.getOutputStream());

                dos.writeBytes(twoHyphens + boundary + lineEnd);
                dos.writeBytes("Content-Disposition: form-data; name=\"textLog\";filename=\""+fileName+"\""+lineEnd);
                dos.writeBytes(lineEnd);

                // create a buffer of  maximum size
                bytesAvailable = fileInputStream.available();

                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                buffer = new byte[bufferSize];

                // read file and write it into form...
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);

                while (bytesRead > 0) 
                    dos.write(buffer, 0, bufferSize);
                    bytesAvailable = fileInputStream.available();
                    bufferSize = Math.min(bytesAvailable, maxBufferSize);
                    bytesRead = fileInputStream.read(buffer, 0, bufferSize);

                

                // send multipart form data necesssary after file data...
                dos.writeBytes(lineEnd);
                dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

                // Responses from the server (code and message)
                int serverResponseCode = conn.getResponseCode();
                String serverResponseMessage = conn.getResponseMessage();
                Toast toast = Toast.makeText(context, "Uploading", Toast.LENGTH_SHORT);
                toast.show();

                if(serverResponseCode == 200)
                    file.delete();
                    Toast toasto = Toast.makeText(context, "success", Toast.LENGTH_SHORT);
                    toasto.show();
                

                fileInputStream.close();
                dos.flush();
                dos.close();
             catch (MalformedURLException ex) 
                Toast toast = Toast.makeText(context, "Malformed URL", Toast.LENGTH_SHORT);
                toast.show();
             catch (Exception e) 
                Toast toast = Toast.makeText(context, "Exception", Toast.LENGTH_SHORT);
                toast.show();
            
        
    

每次执行时,都会出现一个 toast 说明 Inside TRY,然后出现另一个说明“Exception”。

我已经调试了很多,任何形式的帮助都将不胜感激:)

更新

当我执行e.toString 并将其打印出来祝酒时,我得到:android.os.NetworkOnMainThreadException

【问题讨论】:

如果您查看ex 提供的内容(例如printStackTrace 或类似的东西),它会告诉您更多信息 好吧,@ItamarGreen 感谢您的关注,它通常是 BroadCastReciver 的一部分,因此我无法在 AVD 中调试它,因为它没有任何活动。所以基本上它是没有希望的。你知道其他获取堆栈跟踪的方法吗? 嗯,要记录异常,可以参考这里:***.com/questions/7841232/… @ItamarGreen 在哪里?我没有看到那里的链接 你不能编辑代码并打印出异常的toString()吗? 【参考方案1】:

那么答案很简单。您应该在后台线程上运行网络调用。您需要扩展 AsyncTask 并将您的代码移入其中。比如:

private class InitTask extends AsyncTask<Void, Void, Void>
      protected Void doInBackground(Void... p)
         // Call upload file code here
      

【讨论】:

可以是内部类吗? 当然。您可以查看本教程以获得更多解释和示例:androidkennel.org/android-networking-tutorial-with-asynctask。 缺少退货声明@DoronYakovlev-Golani 通过添加return null解决它,现在测试它。但我真的不能在那里展示祝酒词。 这只是一个伪代码骨架(我没有编译)……你要详细填写。

以上是关于文件上传不起作用android的主要内容,如果未能解决你的问题,请参考以下文章

Android Amazon S3文件上传不起作用

适用于 android 的 Cordova '本机文件选择器'插件不起作用

React-Native 多部分照片上传在 android 中不起作用

对象 FileTransfert 的上传()在某些 android 设备上不起作用

从相机上传的照片在 Nexus、Android WebView 中不起作用

Android:反向地理编码不起作用