0

Javaで次のコードを使用して、ネット経由でphpサーバーに画像をアップロードします。

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.util.Log;

public class UploadFiles {

    public void upload(String selectedPath) throws IOException {
        HttpURLConnection conn = null;
        DataOutputStream dos = null;
        DataInputStream inStream = null;
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "AaB03x87yxdkjnxvi7";
        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 1 * 1024 * 1024;
        String urlString = "http://android.1mohammadi.ir/nightly/upload_files.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("uploaded_file", selectedPath);
            dos = new DataOutputStream(conn.getOutputStream());

            dos.writeBytes(twoHyphens + boundary + lineEnd);
            dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""
                    + selectedPath + "\"" + lineEnd);
            dos.writeBytes(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 <span id="IL_AD4" class="IL_AD">write</span> 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);
            // close <span id="IL_AD3" class="IL_AD">streams</span>
            Log.e("Debug", "File is written");
            fileInputStream.close();
            dos.flush();
            dos.close();
        } catch (MalformedURLException ex) {
            Log.e("Debug", "error: " + ex.getMessage(), ex);
        } catch (IOException ioe) {
            Log.e("Debug", "error: " + ioe.getMessage(), ioe);
        }
        // ------------------ read the SERVER RESPONSE
        try {
            inStream = new DataInputStream(conn.getInputStream());
            String str;

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

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

そしてphpサーバーではこれを使用します:

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

/* Add the original filename to our target path.
Result is "uploads/filename.<span id="IL_AD5" class="IL_AD">extension</span>" */
$target_path = $target_path . basename($_FILES['uploadedfile']['name']);

error_log("Upload File >>" . $target_path . "\r\n", 3, "Log.log");

if (move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
    echo "The file " . basename($_FILES['uploadedfile']['name']) .
        " has been uploaded";
} else {
    echo "There was an error uploading the file, please try again!";
    echo "filename: " . basename($_FILES['uploadedfile']['name']);
    echo "target_path: " . $target_path;
}
?>

Androidコードではエラーは発生せず、phpコードでもエラーは発生しません。ファイルのアップロードでファイルを移動できない場合。この問題を解決するにはどうすればよいですか? ありがとう。

4

4 に答える 4

0

これは、アップロード ディレクトリへの書き込みで問題になる可能性があります。/uploads/ディレクトリーが存在し、Web サーバーから書き込み可能であることを確認してください。

curlを使用してサーバー コードをテストすることもできます。それが機能したら、クライアントを機能させることに進むことができます。

于 2012-11-29T21:21:57.420 に答える
0
private void postFile() {
    try {

        // Url to upload file to. Mine points to my folder in xampp
        String postReceiverUrl = "http://ipv4_address/webinterface/UploadToServer.php";
        Log.v("Some message", "postURL: " + postReceiverUrl);

        // new HttpClient
        HttpClient httpClient = new DefaultHttpClient();

        // post header
        HttpPost httpPost = new HttpPost(postReceiverUrl);

        // Gets the image from my drawable folder and compresses it
        Bitmap bm = BitmapFactory.decodeResource(getResources(),
                R.drawable.goku);
        File file = new File(getExternalCacheDir().toString(), "goku.jpg");
        FileOutputStream outStream = new FileOutputStream(file);
        bm.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
        outStream.flush();
        outStream.close();

        // Uri.fromFile(file);

        // File file = new
        // File(Environment.getExternalStorageDirectory(),"goku.jpg");
        // file.getAbsolutePath();
        FileBody fileBody = new FileBody(file);

        MultipartEntity reqEntity = new MultipartEntity(
                HttpMultipartMode.BROWSER_COMPATIBLE);
        reqEntity.addPart("file", fileBody);
        httpPost.setEntity(reqEntity);

        // execute HTTP post request
        HttpResponse response = httpClient.execute(httpPost);
        HttpEntity resEntity = response.getEntity();

        if (resEntity != null) {

            String responseStr = EntityUtils.toString(resEntity).trim();
            Log.v("Some message", "Response: " + responseStr);
        }

    } catch (NullPointerException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
于 2015-07-14T18:56:57.757 に答える
0

1mohammadi.ir は非常によく答えました。彼のコードに何かを追加したいだけです。

アップロード関数を呼び出すには、別のスレッド (メイン スレッドではない) 内で呼び出す必要があります。そうすることで、このリンクに従ってください。android.os.NetworkOnMainThreadException を修正するには?

于 2014-02-15T18:16:17.103 に答える