使用Strings将所有类型的文件从android上传到服务器

时间:2016-10-10 06:06:28

标签: php android

这里我使用此代码将文件上传到php server.i希望将EditText值(String)与文件一起发送,以便我将字符串和图像路径保存到数据库。 如何修改android代码以发送字符串和所选文件。这是代码。

编辑

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

        private static final int PICK_FILE_REQUEST = 1;
        private static final String TAG = MainActivity.class.getSimpleName();
        private String selectedFilePath;
        private String SERVER_URL = "http://coderefer.com/extras/UploadToServer.php";
        ImageView ivAttachment;
        Button bUpload;
        TextView tvFileName;
        ProgressDialog dialog;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ivAttachment = (ImageView) findViewById(R.id.ivAttachment);
            bUpload = (Button) findViewById(R.id.b_upload);
            tvFileName = (TextView) findViewById(R.id.tv_file_name);
            ivAttachment.setOnClickListener(this);
            bUpload.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if(v== ivAttachment){

                //on attachment icon click
                showFileChooser();
            }
            if(v== bUpload){

                //on upload button Click
                if(selectedFilePath != null){
                    dialog = ProgressDialog.show(MainActivity.this,"","Uploading File...",true);

                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            //creating new thread to handle Http Operations
                            uploadFile(selectedFilePath);
                        }
                    }).start();
                }else{
                    Toast.makeText(MainActivity.this,"Please choose a File First",Toast.LENGTH_SHORT).show();
                }

            }
        }

        private void showFileChooser() {
            Intent intent = new Intent();
            //sets the select file to all types of files
            intent.setType("file/*");
            //allows to select data and return it
            intent.setAction(Intent.ACTION_GET_CONTENT);
            //starts new activity to select file and return data
            startActivityForResult(Intent.createChooser(intent,"Choose File to Upload.."),PICK_FILE_REQUEST);
        }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if(resultCode == Activity.RESULT_OK){
                if(requestCode == PICK_FILE_REQUEST){
                    if(data == null){
                        //no data present
                        return;
                    }


                    Uri selectedFileUri = data.getData();
                    selectedFilePath = FilePath.getPath(this,selectedFileUri);
                    Log.i(TAG,"Selected File Path:" + selectedFilePath);

                    if(selectedFilePath != null && !selectedFilePath.equals("")){
                        tvFileName.setText(selectedFilePath);
                    }else{
                        Toast.makeText(this,"Cannot upload file to server",Toast.LENGTH_SHORT).show();
                    }
                }
            }
        }

    //android upload file to server
        public int uploadFile(final String selectedFilePath){

            int serverResponseCode = 0;

            HttpURLConnection connection;
            DataOutputStream dataOutputStream;
            String lineEnd = "\r\n";
            String twoHyphens = "--";
            String boundary = "*****";


            int bytesRead,bytesAvailable,bufferSize;
            byte[] buffer;
            int maxBufferSize = 1 * 1024 * 1024;
            File selectedFile = new File(selectedFilePath);


            String[] parts = selectedFilePath.split("/");
            final String fileName = parts[parts.length-1];

            if (!selectedFile.isFile()){
                dialog.dismiss();

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        tvFileName.setText("Source File Doesn't Exist: " + selectedFilePath);
                    }
                });
                return 0;
            }else{
                try{
                    FileInputStream fileInputStream = new FileInputStream(selectedFile);
                    URL url = new URL(SERVER_URL);
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setDoInput(true);//Allow Inputs
                    connection.setDoOutput(true);//Allow Outputs
                    connection.setUseCaches(false);//Don't use a cached Copy
                    connection.setRequestMethod("POST");
                    connection.setRequestProperty("Connection", "Keep-Alive");
                    connection.setRequestProperty("ENCTYPE", "multipart/form-data");
                    connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
                    connection.setRequestProperty("uploaded_file",selectedFilePath);

                    //creating new dataoutputstream
                    dataOutputStream = new DataOutputStream(connection.getOutputStream());

                    //writing bytes to data outputstream
                    dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);
                    dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""
                            + selectedFilePath + "\"" + lineEnd);

                    dataOutputStream.writeBytes(lineEnd);

                    //returns no. of bytes present in fileInputStream
                    bytesAvailable = fileInputStream.available();
                    //selecting the buffer size as minimum of available bytes or 1 MB
                    bufferSize = Math.min(bytesAvailable,maxBufferSize);
                    //setting the buffer as byte array of size of bufferSize
                    buffer = new byte[bufferSize];

                    //reads bytes from FileInputStream(from 0th index of buffer to buffersize)
                    bytesRead = fileInputStream.read(buffer,0,bufferSize);

                    //loop repeats till bytesRead = -1, i.e., no bytes are left to read
                    while (bytesRead > 0){
                        //write the bytes read from inputstream
                        dataOutputStream.write(buffer,0,bufferSize);
                        bytesAvailable = fileInputStream.available();
                        bufferSize = Math.min(bytesAvailable,maxBufferSize);
                        bytesRead = fileInputStream.read(buffer,0,bufferSize);
                    }

                    dataOutputStream.writeBytes(lineEnd);
                    dataOutputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

                    serverResponseCode = connection.getResponseCode();
                    String serverResponseMessage = connection.getResponseMessage();

                    Log.i(TAG, "Server Response is: " + serverResponseMessage + ": " + serverResponseCode);

                    //response code of 200 indicates the server status OK
                    if(serverResponseCode == 200){
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                tvFileName.setText("File Upload completed.\n\n You can see the uploaded file here: \n\n" + "http://coderefer.com/extras/uploads/"+ fileName);
                            }
                        });
                    }

                    //closing the input and output streams 
                    fileInputStream.close();
                    dataOutputStream.flush();
                    dataOutputStream.close();



                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this,"File Not Found",Toast.LENGTH_SHORT).show();
                        }
                    });
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                    Toast.makeText(MainActivity.this, "URL error!", Toast.LENGTH_SHORT).show();

                } catch (IOException e) {
                    e.printStackTrace();
                    Toast.makeText(MainActivity.this, "Cannot Read/Write File!", Toast.LENGTH_SHORT).show();
                }
                dialog.dismiss();
                return serverResponseCode;
            }

        }
    }

2 个答案:

答案 0 :(得分:0)

您可以使用:

boolean fileUploadWithStringData(Context context,String uriPart,Map<String, String> textParams) {
                try {
                    HttpParams params = new BasicHttpParams();
                    params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION,
                            HttpVersion.HTTP_1_1);

                    int timeoutConnection = 60*1000;
                    HttpConnectionParams.setConnectionTimeout(params, timeoutConnection);
                    int timeoutSocket = 90*1000;
                    HttpConnectionParams.setSoTimeout(params, timeoutSocket);
                    DefaultHttpClient   httpclient = new DefaultHttpClient(params);


                    Object response = null;
                    MultipartEntityBuilder builder = MultipartEntityBuilder.create();
                    builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

                    // Add text params
                    Iterator<String> keys = textParams.keySet().iterator();
                    while (keys.hasNext()) {
                        String key = keys.next();

                        String value = textParams.get(key);
                        builder.addTextBody(key, value, ContentType.TEXT_PLAIN);
                    }
                    String filePathOnDisc = textParams.get("pathOnDisk");
                    // Add file param
                    Uri uri = Uri.parse(filePathOnDisc);
                    File file = new File(filePathOnDisc);
                    if(!file.exists())
                        return true;
                    builder.addPart("uploadFile", new FileBody(file));

                    uriPart=addJSessionToURI(context,uriPart);
                    HttpPost httppost = new HttpPost("http://" + serverURL + uriPart);
                    httppost.setEntity(builder.build());
                    ResponseHandler<JsonArray> responseHandler = new ResponseHandler<JsonArray>(){

                        @Override
                        public JsonArray handleResponse(HttpResponse response)
                                throws ClientProtocolException, IOException {
                            int status = response.getStatusLine().getStatusCode();
                            if (status >= 200 && status < 300) {
                                System.out.println("Image Upload Success");
                                return new JsonArray();
                            }
                            else{
                                    return null;
                            }

                        }                   
                    };
                    response = httpclient.execute(httppost, responseHandler);
                    if(response!=null)
                    return true;
                    if(response==null)
                        return false;

                }

                catch (SocketTimeoutException e) 
                {
                     e.printStackTrace();
                     System.out.println("Socket connection time out");

                     return false;

                    // return fileUpload( context, uriPart, textParams);
                }

                catch(ConnectTimeoutException ex){
                    ex.printStackTrace();
                     System.out.println("ConnectTimeoutException");

                    //return fileUpload( context, uriPart, textParams);
                    return false;
                }
                catch (Exception e)
                {
                    System.out.println("  exception  "+e.toString());

                    Log.e("",""+e.toString());
                    e.printStackTrace();
                    return false;
                }
                 return false;
            }

答案 1 :(得分:0)

有一种简单的方法:向您的SERVER_URL添加GET参数:

// replace "meh" by the text from your EditText
String SERVER_URL = "http://coderefer.com/extras/UploadToServer.php?name=meh";

然后,在服务器端,在UploadToServer.php中添加一个将检索此GET参数的代码:

<?php
$photoName = filter_input(INPUT_GET, 'name');

请注意,使用GET传递数据并不是最佳方法,您需要注意编码和文本的size