Android版(Java)的文件上传到PHP servar无法与Android 4.03 [英] Android (Java) file upload to PHP servar fails with Android 4.03

查看:134
本文介绍了Android版(Java)的文件上传到PHP servar无法与Android 4.03的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们已经,具有良好的效果,使用的脚本为我们的游戏,连接到PHP文件,以便文件上传到远程服务器。当我们升级至Android 4.03脚本突然无法连接到服务器,我们不知道为什么。它工作得非常好与Android 2.3.4及以上。

We have, with good result, used a script for a game of ours that connects to a php-file in order to upload files to a remote server. When we upgrade to Android 4.03 the script suddenly fails to connect to the server and we have no clue why. It works very well with Android 2.3.4 and older.

public static String uploadOrderFile(Context c) {
String error = "";

HttpURLConnection conn = null;
DataOutputStream dos = null;
DataInputStream inStream = null;
FileInputStream fileInputStream = null;

String exsistingFileName = String.format("orders%d.ser", empire.getId());
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary =  "*****";

int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1*1024*1024;
String responseFromServer = "";

try {
    //------------------ CLIENT REQUEST
    // Opening streams.
    if(settings.isSaveToExternalStorage()) {
        File file = new File(Environment.getExternalStorageDirectory(), String.format("%sorders%s.ser", c.getString(R.string.pathExternalStorage), empire.getId()));
        fileInputStream = new FileInputStream(file);
    }
    else {
        fileInputStream = c.openFileInput(exsistingFileName);
    }

    // open a URL connection to the Servlet
    String s = c.getString(R.string.webPageOrders);
    URL url = new URL(s);
    // 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("Content-Type", "multipart/form-data;boundary="+boundary);

    dos = new DataOutputStream( conn.getOutputStream() );
    dos.writeBytes(twoHyphens + boundary + lineEnd);
    dos.writeBytes(String.format("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"%s\"%s", exsistingFileName, 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);
}
catch(FileNotFoundException fnfe) {
    error = "Error. Couldn't find the order file internally.";
    Log.e(TAG, error, fnfe);
}
catch (MalformedURLException murle) {
    error = "Error. Couldn't create correct file URL.";
    Log.e(TAG, error, murle);
}
catch(ProtocolException pe) {
    error = "Error. Couldn't upload the order file to server.";
    Log.e(TAG, error, pe);
}
catch (IOException ioe) {
    error = "Error. Couldn't upload the order file to server.";
    Log.e(TAG, error, ioe);
}
finally {
    try {
        // Closing streams and connections.
        if(fileInputStream != null) {
            fileInputStream.close();
        }
        if(conn != null) {
            conn.disconnect();
        }
        if(dos != null) {
            dos.flush();
            dos.close();
        }
    }
    catch(IOException ioe) {
        error = "Error. Couldn't disconnect internet stream buffers.";
        Log.e(TAG, error, ioe);
    }
}
if(!error.equals("")) {
    return error;
}
//Reading the server response.
try {
    inStream = new DataInputStream ( conn.getInputStream() );
    String str;
    while (( str = inStream.readLine()) != null) {
        responseFromServer += str;
    }
}
catch (IOException ioe){
    error = "Error. Couldn't read server response.";
    Log.e(TAG, error, ioe);
}
finally {
    try {
        // Closing streams.
        if(inStream != null) {
            inStream.close();
        }
    }
    catch(IOException ioe) {
        error = "Error. Couldn't disconnect internet stream buffers.";
        Log.e(TAG, error, ioe);
    }
}
return error;}

在我们有以下的PHP文件服务器:

On the server we have the following PHP-file:

<?php

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

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

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

  echo "The file ".  basename( $_FILES['uploadedfile']['name']).
    " has been uploaded";
    chmod ("orders/".basename( $_FILES['uploadedfile']['name']), 0644);

} 
else{

echo "There was an error uploading the file, please try again!";
echo "filename: " .  basename( $_FILES['uploadedfile']['name']);
echo "target_path: " .$target_path;

}?>

这个问题的任何帮助都AP preciated。它为什么失败与Android 4.03焕它的工作原理与flawlessle previous版本?

Any help with this problem is appreciated. Why does it fail with Android 4.03 whan it works flawlessle with previous versions?

感谢您!

推荐答案

试试这个

class getEditingHUD extends AsyncTask<String, Long, Integer> {

    protected void onPreExecute() {
        super.onPreExecute();
        loading = ProgressDialog.show(HtmlViwer.this, null,
                "Please wait...");
    }

    protected Integer doInBackground(String... params) {
        File file = new File(Environment.getExternalStorageDirectory(), "yourfile.html");
        try {
            FileInputStream fis = new FileInputStream(file);
            String myserver = "http://your server/phpfile.php";
            HttpFileUploader htfu = new HttpFileUploader(myserver,
                    "noparamshere", Modules.currentProgram + ".html");
            htfu.doStart(fis);
        } catch (Exception e) {
            Log.e("Error Readingfile", e.toString());
        }

        return null;
    }

    protected void onPostExecute(Integer result) {
        super.onPostExecute(result);
        try {
            if (loading != null && loading.isShowing())
                loading.dismiss();
        } catch (Throwable t) {

        }
    }

}

和这个HttpFileUploader类

and this HttpFileUploader class

public class HttpFileUploader implements Runnable {

URL connectURL;
String params;
String responseString;
// InterfaceHttpUtil ifPostBack;
String fileName;
byte[] dataToServer;

HttpFileUploader(String urlString, String params, String fileName) {
    try {
        connectURL = new URL(urlString);
    } catch (Exception ex) {
        Log.i("URL FORMATION", "MALFORMATED URL");
    }
    this.params = params + "=";
    this.fileName = fileName;

}

void doStart(FileInputStream stream) {
    fileInputStream = stream;
    PrakitoServer();
}

FileInputStream fileInputStream = null;

void PrakitoServer() {
    String exsistingFileName = "print.html";

    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";
    String Tag = "3rd";
    try {
        // ------------------ CLIENT REQUEST

        Log.e(Tag, "Starting to bad things");
        // Open a HTTP connection to the URL

        HttpURLConnection conn = (HttpURLConnection) connectURL
                .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("Content-Type",
                "multipart/form-data;boundary=" + boundary);

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

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

        Log.e(Tag, "Headers are written");

        // create a buffer of maximum size

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

        // read file and write it into form...

        int 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);

        // close streams
        Log.e(Tag, "File is written");
        fileInputStream.close();
        dos.flush();

        InputStream is = conn.getInputStream();
        // retrieve the response from server
        int ch;

        StringBuffer b = new StringBuffer();
        while ((ch = is.read()) != -1) {
            b.append((char) ch);
        }
        String s = b.toString();
        Log.i("Response", s);
        dos.close();

    } catch (MalformedURLException ex) {
        Log.e(Tag, "error: " + ex.getMessage(), ex);
    }

    catch (IOException ioe) {
        Log.e(Tag, "error: " + ioe.getMessage(), ioe);
    }
}

@Override
public void run() {
    // TODO Auto-generated method stub

}

}

这篇关于Android版(Java)的文件上传到PHP servar无法与Android 4.03的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆