6

シナリオ: サービスで HttpURLConnection を介して POST データを送信しようとしています (進行状況の更新あり)。ギャラリーから画像を取得し、2 つのパラメーターを使用して php サーバーに送信しています。invnum とパスワード。

注: HttpClient メソッドで実行している場合、パラメーターと画像はサーバーで送受信されますが、アップロードの進行状況を追跡できません。カスタム マルチパート エンティティに関連するコードをいくつか見ましたが、可能な限りライブラリの参照を避けたいと考えています

SOで関連する多くの質問を調べましたが、解決策が見つからないようです。以下は、私がサービスで使用している現在のコードです。

protected void onHandleIntent(Intent intent) {
    String invnum = intent.getStringExtra("invnum");
    String uploadURL = intent.getStringExtra("uploadURL");
    String imageURI = intent.getStringExtra("imageURI");
    uri = Uri.parse(imageURI);

    String pass = "password";

    //get the actual path of the image residing in the phone
    String[] filePathColumn = { MediaStore.Images.Media.DATA };
    Cursor cursor = getContentResolver().query(uri,filePathColumn, null, null, null);
    cursor.moveToFirst();
    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    picturePath = cursor.getString(columnIndex);
    cursor.close();

    ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver");

    //check url
    try {
        File file = new File(picturePath);
        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] bytes = new byte[(int) file.length()];
        fileInputStream.read(bytes);
        fileInputStream.close();

        String fileName = file.getName();

        URL url = new URL(uploadURL);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.setDoOutput(true);
        connection.setUseCaches(false);
        connection.setConnectTimeout(30000);
        connection.setReadTimeout(30000);
        connection.setChunkedStreamingMode(1024);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)");
        connection.setRequestProperty("image", fileName);
        connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);

        DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());

        //send multipart form data (required) for file
        outputStream.writeBytes("Content-Disposition: form-data; name=\"image\";filename=\"" + fileName + "\"" + lineEnd);
        outputStream.writeBytes("Content-Type: image/jpeg" + lineEnd);
        //outputStream.writeBytes("Content-Type: " + URLConnection.guessContentTypeFromName(fileName) + lineEnd);
        //outputStream.writeBytes("Content-Transfer-Encoding: binary" + lineEnd);
        //outputStream.writeBytes("Content-Type: application/octet-stream" + lineEnd);
        outputStream.writeBytes("Content-Length: " + file.length() + lineEnd);
        outputStream.writeBytes(lineEnd);

        int bufferLength = 1024;
        for (int i = 0; i < bytes.length; i += bufferLength) {
            // publishing the progress....
            Bundle resultData = new Bundle();
            resultData.putInt("progress" ,(int)((i / (float) bytes.length) * 100));
            receiver.send(UPDATE_PROGRESS, resultData);

            if (bytes.length - i >= bufferLength) {
                outputStream.write(bytes, i, bufferLength);
            } else {
                outputStream.write(bytes, i, bytes.length - i);
            }
        }

        //end output
        outputStream.writeBytes(lineEnd);

        //write more parameters other than the file
        outputStream.writeBytes(twoHyphens + boundary + lineEnd);
        //outputStream.writeBytes(twoHyphens + boundary + lineEnd); //less twohyphens
        outputStream.writeBytes("Content-Disposition: form-data; name=\"invnum\"" + lineEnd);
        //outputStream.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd);
        //outputStream.writeBytes("Content-Length: " + invnum.length() + lineEnd);
        outputStream.writeBytes(lineEnd);
        outputStream.writeBytes(invnum + lineEnd);
        outputStream.writeBytes(twoHyphens + boundary + lineEnd);

        outputStream.writeBytes("Content-Disposition: form-data; name=\"pass\"" + lineEnd);
        //outputStream.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd);
        //outputStream.writeBytes("Content-Length: " + pass.length() + lineEnd);
        outputStream.writeBytes(lineEnd);
        outputStream.writeBytes(pass + lineEnd);
        outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

        // publishing the progress....
        Bundle resultData = new Bundle();
        resultData.putInt("progress", 100);
        receiver.send(UPDATE_PROGRESS, resultData);

        outputStream.flush();
        outputStream.close();
        //input ignored for now

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

アプリを実行すると、進行状況がうまく反映されますが、サーバーで確認すると、ファイルがまったくアップロードされません。実際、サーバーによってデータが送受信されることはありません。この問題を引き起こしている可能性のあるものは誰にも分かりますか? 以下は私のサーバーコードです。

$pass = $_POST['pass'];
$invnum = $_POST['invnum'];
$image = $_POST['image'];
if ($pass == 'password') {
    //do something
}

更新: まず、HTTPURLConnection から 404 エラーが発生します。私の URL は " http://www.xyz.com/upload.php "のようになります。「setChunkedStreamingMode」を削除することにより、前の文を更新すると、サーバーにパラメーターを正常にアップロードできますが、画像はアップロードできません! 近くにいます!

4

2 に答える 2