Android的文件上传 - $ _FILES返回空文件上传、Android、_FILES

2023-09-07 22:02:52 作者:尋歡作樂

我想从Android应用程序一个图像上传到一个PHP脚本的服务器。 HTTP响应返回状态OK:200,但是$ _FILES [upfile] [名称]返回空。 I`ve检查了我的文件夹权限和aready为777。

I'm trying to upload a image from Android App to a server with a PHP Script. The HTTP Response returns STATUS OK: 200, but the $_FILES["upfile"]["name"] returns empty. I`ve checked my folders permissions and aready is 777.

我的.java类

  /********************UPLOAD DATA*************************************/
class UploadImg extends AsyncTask<Void, Void, Void>{

    NetworkInfo net;

    Messaging uActivity;

    HttpURLConnection connection = null;
    DataOutputStream outputStream = null;
    DataInputStream inputStream = null;

    String folderPath;
    String arrayOfFiles[];
    File root;
    File allFiles;

    String urlServer = "http://bmcpublicidade.com.br/chat/upload.php";
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary =  "*****";

    int bytesRead, bytesAvailable, bufferSize;
    byte[] buffer;
    int maxBufferSize = 10*1024*1024;

    URL url;

     ProgressDialog pDialog = new ProgressDialog(Messaging.this);



    @Override
    protected void onPreExecute() {


        Log.d(" UploadImg","onPreRequest");

            pDialog.setMessage("Uploading GPS Data. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();


    }

    @Override
    protected Void doInBackground(Void... params) {

         Log.d(" UploadData","doInBackground");

         String fileName = ""+selectedPath;
         HttpURLConnection conn = null;
         DataOutputStream dos = null;
         BufferedReader inStream = null;
         String lineEnd = "rn";
         String twoHyphens = "--";
         String boundary =  "*****";
         int bytesRead, bytesAvailable, bufferSize;
         byte[] buffer;
         int maxBufferSize = 10*1024*1024;
         String responseFromServer = "";
         String urlString = "http://bmcpublicidade.com.br/chat/upload.php";
         try
         {
          //------------------ CLIENT REQUEST
         FileInputStream fileInputStream = new FileInputStream(new File(selectedPath) );
          // open a URL connection to the Servlet
          URL url = new URL(urlString);
          // Open a HTTP connection to the URL
          conn = (HttpURLConnection) url.openConnection();
          // Allow Inputs
          conn.setDoInput(true);
          // Allow Outputs
          conn.setDoOutput(true);
          // Don't use a cached copy.
          conn.setUseCaches(false);
          // Use a post method.
          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("upfile", fileName); 
          dos = new DataOutputStream( conn.getOutputStream() );
          dos.writeBytes(twoHyphens + boundary + lineEnd);
          dos.writeBytes("Content-Disposition: form-data; name=\"upfile\"; filename='"+ selectedPath +"'" + 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("upfile", "HTTP Response is : "
                  + serverResponseMessage + ": " + serverResponseCode);

          if(serverResponseCode == 200){

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

                       String msg = "File Upload Completed.\n\n See uploaded file here : \n\n"
                                     +" http://**********/media/uploads/";

                       messageText.setText(msg);
                       Toast.makeText(Messaging.this, "File Upload Complete.", 
                                    Toast.LENGTH_SHORT).show();
                   }
               });                
          }    

          // close streams
          Log.e("Debug","gravando arquivo: " + fileName);
          fileInputStream.close();
          dos.flush();
          dos.close();
         }
         catch (MalformedURLException ex)
         {
              Log.e("Debug", "erro: " + ex.getMessage(), ex);
         }
         catch (IOException ioe)
         {
              Log.e("Debug", "erro: " + ioe.getMessage(), ioe);
         }
         //------------------ read the SERVER RESPONSE
         try {
               inStream = new BufferedReader ( new InputStreamReader(conn.getInputStream()) );
               String str;

               while (( str = inStream.readLine()) != null)
               {
                    Log.e("Debug","Servidor diz:  "+str);
               }
               inStream.close();

         }
         catch (IOException ioex){
              Log.e("Debug", "erro: " + ioex.getMessage(), ioex);
         }


    return null;
    }

    @Override
    protected void onPostExecute(Void result) {

         Log.d(" UploadMSG","onPost");

        pDialog.dismiss();

        messageText.setText("Uploaded");
    }
}
/********************END OF UPLOAD*************************************/

和这里是我的PHP文件

and here is my php file

// Where the file is going to be placed
$target_path = "uploads/";

/* Add the original filename to our target path.
Result is "/uploads/filename.extension" */
$target_path = $target_path . basename( $_FILES['upfile']['name']);

if( $_FILES['upfile'] )
{
    if(move_uploaded_file($_FILES['upfile']['tmp_name'], $target_path)) {

        // $qry = "UPDATE users set image=".$target_path." where username='$username'";
        // $db->query($qry);

        echo "O arquivo ".  basename( $_FILES['upfile']['name']).
        " está sendo enviado";
    } else{
        echo "Ocorreu um erro ao realizar envio de arquivo, por favor tente novamente!\n";
        echo "Nome do arquivo: " .  basename( $_FILES['upfile']['name'])."\n";
        echo "target_path: " .$target_path;
    }
}else
{
    echo "Nenhum arquivo careregado!"; 



    /*** ever enters here!!! ***/
}

您能帮我吗?

谢谢!

推荐答案

我刚刚遇到了同样的问题。发布一个文件,成功了200响应,但_FILES是空的。我通过指定Content-Length头固定的问题。例如:

I've just encountered the same issue. POSTing a file succeeds with a 200 response, but _FILES is empty. I fixed the issue by specifying the Content-Length header. E.g.:

conn.setRequestProperty("Content-Length", Integer.toString(fileInputStream.available()));

编辑:所以,当使用这个,文件出现在_FILES但随着3错误code不过,我也有打电话给conn.setChunkedStreamingMode(1024);.删除内容长度和工作对我来说调用setChunkedStreamingMode,但我pretty的确保空_FILES是做内容长度字段不正确设置。

So, when using this, the file appeared in _FILES but with an error code of 3. However, I also had a call to conn.setChunkedStreamingMode(1024);. Removing the Content-Length and the call to setChunkedStreamingMode worked for me, but I'm pretty sure that the empty _FILES is to do with the Content-Length field not being set correctly.

 
精彩推荐
图片推荐