【问题标题】:Uploading an image to server from android using HTTP POST request使用 HTTP POST 请求将图像从 android 上传到服务器
【发布时间】:2014-06-12 08:43:07
【问题描述】:

我想将图像从我的 android 应用程序上传到服务器。我不知道问题出在我正在使用的代码中——它应该可以工作! -。这是我第一次这样做,所以我对此知之甚少。

该代码没有捕获任何异常,但它从未进入服务器响应为“200”的 if 语句......并且永远不会上传图像。

您能回答以下问题吗?

1) 这个属性是什么意思?

conn.setRequestProperty("uploaded_file", "Thumbnail"+user_id); 

2) 为什么这行的意思是?我知道它会使用数据输出流写入服务器,但是里面的参数是什么?

dos.writeBytes("Content-Disposition: form-data; name=uploaded_file;filename=Thumbnail"+
                                  user_id+ lineEnd);

============

public void upload_to_server(File [] sdDirList, int fileIndex) throws IOException
    {
        final ProgressDialog dialog = ProgressDialog.show(SettingsActivity.this, "", "Uploading Image...", true);
        final String upLoadServerUri = "server side php script goes here";


        //***File path ***//
        final String uploadFilePath = sdDirList[fileIndex].getCanonicalPath();
        runOnUiThread(new Runnable() {
            public void run() {
                Toast.makeText(SettingsActivity.this, uploadFilePath, 
                        Toast.LENGTH_SHORT).show();
     }
        });


       //***Display the dialog of the upload state***//

        new Thread(new Runnable() 
        {
            //Sending thread
                public void run() 
              {
                    dialog.show();

                    String fileName = uploadFilePath;
                    int serverResponseCode = 0;
                    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; 
                    File sourceFile = new File(uploadFilePath); 

                    if (!sourceFile.isFile()) 
                    {
                        runOnUiThread(new Runnable() {
                            public void run() {
                                Toast.makeText(SettingsActivity.this, "File is not valid..", 
                                        Toast.LENGTH_SHORT).show();
                     }
                        });

                         dialog.dismiss(); 
                         return;
                    }

                    else
                    {
                        runOnUiThread(new Runnable() {
                            public void run() {
                                Toast.makeText(SettingsActivity.this, "Entered else block", 
                                        Toast.LENGTH_SHORT).show();
                     }
                        });

                         try 
                         { 

                               // open a URL connection to the Servlet
                             FileInputStream fileInputStream = new FileInputStream(sourceFile);
                             URL url = new URL(upLoadServerUri);

                             // 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("uploaded_file", "Thumbnail"+user_id); 

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

                             dos.writeBytes(twoHyphens + boundary + lineEnd); 
                             dos.writeBytes("Content-Disposition: form-data; name=uploaded_file;filename=Thumbnail"+
                                  user_id+ 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)
                             serverResponseCode = conn.getResponseCode();
                             String serverResponseMessage = conn.getResponseMessage();

                             Log.i("uploadFile", "HTTP Response is : "
                                     + serverResponseMessage + ": " + serverResponseCode);

                             runOnUiThread(new Runnable() {
                                 public void run() {
                                     Toast.makeText(SettingsActivity.this, "reached reponses's if", 
                                             Toast.LENGTH_SHORT).show();
                          }
                             });
                             if(serverResponseCode == 200)
                             {

                                 runOnUiThread(new Runnable() {
                                      public void run() 
                                      {


                                          Toast.makeText(SettingsActivity.this, "File Upload Complete.", 
                                                       Toast.LENGTH_SHORT).show();
                                      }
                                  });                
                             }    

                             //close the streams //
                             fileInputStream.close();
                             dos.flush();
                             dos.close();

                             runOnUiThread(new Runnable() {
                                 public void run() {
                                     Toast.makeText(SettingsActivity.this, "End of Try", 
                                             Toast.LENGTH_SHORT).show();
                          }
                             });

                        } 
                         catch (MalformedURLException ex) 
                        {
                             runOnUiThread(new Runnable() {
                                 public void run() {
                                     Toast.makeText(SettingsActivity.this, "in first catch", 
                                                                         Toast.LENGTH_SHORT).show();
                                 }
                             });


                            dialog.dismiss();  
                            ex.printStackTrace();

                            runOnUiThread(new Runnable() {
                                public void run() {
                                    Toast.makeText(SettingsActivity.this, "MalformedURLException", 
                                                                        Toast.LENGTH_SHORT).show();
                                }
                            });

                            Log.e("Upload file to server", "error: " + ex.getMessage(), ex);  

                        } 
                         catch (Exception e) 
                         {
                             runOnUiThread(new Runnable() {
                                 public void run() {
                                     Toast.makeText(SettingsActivity.this, "in second catch", 
                                                                         Toast.LENGTH_SHORT).show();
                                 }
                             });

                            dialog.dismiss();  
                            e.printStackTrace();

                            runOnUiThread(new Runnable() {
                                public void run() {
                                    Toast.makeText(SettingsActivity.this, "Something went wrong..", 
                                            Toast.LENGTH_SHORT).show();
                                }
                            });
                            Log.e("Upload file to server Exception", "Exception : "
                                                             + e.getMessage(), e);  
                        }

                         runOnUiThread(new Runnable() {
                             public void run() {
                                 Toast.makeText(SettingsActivity.this, "end of else", 
                                                                     Toast.LENGTH_SHORT).show();
                             }
                         });
                        dialog.dismiss();       

                     } // End else block 




              }
        }).start();  

    }

=============================

PHP 脚本:

<?php
  
    $file_path = "uploads/";
     
    $file_path = $file_path . basename( $_FILES['uploaded_file']['name']);
    if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $file_path)) {
        echo "success";
    } else{
        echo "fail";
    }
 ?>

【问题讨论】:

    标签: php android post


    【解决方案1】:

    1)

    conn.setRequestProperty("uploaded_file", "Thumbnail"+user_id); 
    

    有两个参数,

    第一个参数:它是在你的 php 文件中定义的用于获取文件的变量名(必须与 php 文件中定义的相同)。

    第二个参数:它是你要上传的文件..

    2)

    dos.writeBytes("Content-Disposition: form-data; name=uploaded_file;filename=Thumbnail"+ user_id+ lineEnd);
    

    它类似于您传递给DataOutputStream.. 的查询字符串。在这里,您传递文件通过变量(您定义的向上)和该文件的文件名..

    这里, uploaded_file 是 server(php) 中定义的变量名,

    name & filename 是字段名称(请勿更改)..您可以根据需要更改其值

    如果您想要上传文件的好教程,请访问此链接: Multipart HTTP Requests

    谢谢...

    【讨论】:

    • 我想了解更多关于 writeBytes 的信息;是与“setRequestProperty”相关的参数值吗?并且“filename = ..”是否必须与我要上传的文件匹配,还是像重命名一样?对不起,但我有点困惑;因为源文件已经作为输入流传递..非常感谢您的链接和您的回答:)。
    • 你不应该改变"filename="属性..它会导致上传错误..所有文件都一样...
    • 很高兴帮助... +1 为它.. :)
    • 它现在可能可以工作了,我将文件名保持不变,并在服务器上的上传文件夹中添加了缺少的“777”权限。再次感谢您的回答。
    【解决方案2】:
    Try This code and this library add httpmime-4.1-beta1.jar :  
    
    
      String url = "Your Url";
    
    
                    HttpClient client = new DefaultHttpClient();
                    client.getParams().setParameter(
                            CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
                    HttpPost postMethod = new HttpPost(url);
    
    
                    MultipartEntity entity = new MultipartEntity();
    
    
    
                    try {
    
                            File file1 = new File("Your image Path");
                            FileBody bin1 = new FileBody(file1, "images/jpeg");
    
                            entity.addPart("uploaded_file", bin1);
    
                        postMethod.setEntity(entity);
                        HttpResponse response;
                        response = client.execute(postMethod);
    
                        String result = EntityUtils.toString(response.getEntity());
    
                    }
    
                    catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
    

    【讨论】:

    • 非常感谢,我会使用这个库以防原始代码不起作用,它看起来更加封装和可读。
    【解决方案3】:

    文件上传代码:

    String upLoadServerUri_here = "Your url " ;
    
    
    
     private int serverResponseCode = 0;
         private Context mContext ;
    
    public int upload_to_server(final String imagepath) {
    
            String fileName = imagepath;
            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 ;
            File sourceFile = new File(imagepath);
    
            if (!sourceFile.isFile()) {
              Log.e("uploadFile", "Source File not exist :" + imagepath);
    
                ((Activity) mContext).runOnUiThread(new Runnable() {
                     public void run() {
    
                         Toast.makeText(mContext, "Source File not found "+imagepath ,Toast.LENGTH_LONG).show();     
                  }
                 });
    
                 return 0;
    
            }
            else
            {
                 try {
    
    
                     FileInputStream fileInputStream = new FileInputStream(sourceFile);
                     URL url = new URL(upLoadServerUri_here);
    
    
                     // Open a HTTP  connection to  the URL
                     conn = (HttpURLConnection) url.openConnection();
                     conn.setDoInput(true);
                     conn.setDoOutput(true); 
                     conn.setUseCaches(false);
                     conn.setRequestMethod("POST");
                     conn.setRequestProperty("Connection", "attachment");
                     conn.setRequestProperty("ENCTYPE", "multipart/form-data");
                     conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
                     conn.setRequestProperty("uploaded_file", fileName);
    
                     dos = new DataOutputStream(conn.getOutputStream());
    
                     dos.writeBytes(twoHyphens + boundary + lineEnd);
                     dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";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);  
    
                      }
    
    
                     dos.writeBytes(lineEnd);
                     dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
                     serverResponseCode = conn.getResponseCode();
                     String serverResponseMessage = conn.getResponseMessage();
    
                     Log.i("uploadFile", "HTTP Response is : " + serverResponseMessage + ": " + serverResponseCode);
                     Toast.makeText(mContext, "Got.."+serverResponseMessage, Toast.LENGTH_SHORT).show(); 
    
    
                     if(serverResponseCode == 200){
    
                     //chk it @ C:\inetpub\wwwroot\Uploads\Work
                 ((Activity) mContext).runOnUiThread(new Runnable() {
                              public void run() {
    
    
                                  Toast.makeText(mContext, "sucesss..", Toast.LENGTH_SHORT).show();
                              }
                          });               
                     }   
    
                     //close the streams //
                     fileInputStream.close();
                     dos.flush();
                     dos.close();
    
                } catch (MalformedURLException ex) {
    
                  //  dialog.dismiss(); 
                    ex.printStackTrace();
    
                    ((Activity) mContext).runOnUiThread(new Runnable() {
                        public void run() {
    
                            Toast.makeText(mContext, "MalformedURLException", Toast.LENGTH_SHORT).show();
                        }
                    });
    
                    Log.e("Upload file to server", "error: " + ex.getMessage(), ex); 
                } catch (Exception e) {
    
    
                    e.printStackTrace();
    
                    ((Activity) mContext).runOnUiThread(new Runnable() {
                        public void run() {
    
                            Toast.makeText(mContext, "Got Exception : see logcat "+serverResponseCode, Toast.LENGTH_SHORT).show();
                        }
                    });
    
    
                    Log.e("Upload file to server Exception", "Exception : "  + e.getMessage(), e); 
                }
    
                return serverResponseCode;
    
             } 
           }
    

    imagepath = "yourselectedimage with full path";

    【讨论】:

    • void java.net.URLConnection.setRequestProperty(String field, String newValue) public void setRequestProperty(String field, String newValue) 设置指定请求头域的值。该值将仅由当前 URLConnection 实例使用。该方法只能在连接建立之前调用。参数 field 要设置的请求头字段。 newValue 指定属性的新值。如果连接已经建立,则抛出 IllegalStateException。如果参数字段为空,则 NullPointerException。
    • 感谢您的回复,我现在了解request属性,感谢您和prag的回答,但是您发布的代码几乎相同,我修改了它并且“writeByte(内容)只有一个区别...),你能指出我在代码中犯的错误吗?
    • 谢谢.. 您的文件将不会返回“成功”,直到它以正确的格式获取文件,该文件位于 php if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $file_path )),因此请检查 writeByte(content...) 并了解更多详细信息 chk coderzheaven.com/2012/03/29/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多