2012-05-30 24 views
5

以下は、サーバーにファイルをアップロードするための私のコードです。しかし、私はいくつかの試行の後で、厳密なモードを追加した後でさえ、ネットワーク例外を得ています。非同期タスクを使用してファイルをサーバーにアップロードするにはどうすればよいですか?

私は、Androidに新たなんだと私は多くの人々がネットワーク操作のような種類のためにお勧めの非同期タスクを、どのように使用できるかわかりません。誰が私がコード内でどこが間違っていて、どこで非同期タスクを使用すべきか教えていただけますか?詳細については

package de.fileuploader; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.InputStreamReader; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.mime.HttpMultipartMode; 
import org.apache.http.entity.mime.MultipartEntity; 
import org.apache.http.entity.mime.content.ByteArrayBody; 
import org.apache.http.entity.mime.content.FileBody; 
import org.apache.http.entity.mime.content.StringBody; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.protocol.BasicHttpContext; 
import org.apache.http.protocol.HttpContext; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.os.StrictMode; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

@SuppressWarnings("unused") 
public class Android_helloActivity extends Activity { 

private String newName = "SMSBackup.txt"; 
private String uploadFile = "/mnt/sdcard/SMSBackup.txt"; 
private String actionUrl = "http://192.168.1.8:8080/admin/admin/uploads"; 
// private String 
// actionUrl="http://upload-file.shcloudapi.appspot.com/upload"; 
private TextView mText1; 
private TextView mText2; 
private Button mButton; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
     .detectDiskReads() 
     .detectDiskWrites() 
     .detectNetwork() // or .detectAll() for all detectable problems 
     .penaltyLog() 
     .build()); 
     StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() 
     .detectLeakedSqlLiteObjects() 
     .detectLeakedClosableObjects() 
     .penaltyLog() 
     .penaltyDeath() 
     .build()); 

     mText1 = (TextView) findViewById(R.id.myText2); 
     mText1.setText("Upload\n" + uploadFile); 
     mText2 = (TextView) findViewById(R.id.myText3); 
     mText2.setText("To Server Location\n" + actionUrl); 

     mButton = (Button) findViewById(R.id.myButton); 
     mButton.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 
         /* uploadFile(); */ 
         try { 
           HttpClient httpClient = new DefaultHttpClient(); 
           HttpContext localContext = new BasicHttpContext(); 
           HttpPost httpPost = new HttpPost(actionUrl); 

           MultipartEntity entity = new MultipartEntity(
               HttpMultipartMode.BROWSER_COMPATIBLE); 
           entity.addPart("name", new StringBody(newName)); 
           File file=new File(uploadFile); 
           entity.addPart("file", new FileBody(file)); 
           //entity.addPart("file", new 
           ByteArrayBody(data,"myImage.jpg")); 
           entity.addPart("gps", new StringBody("35.6,108.6")); 
           httpPost.setEntity(entity); 
           HttpResponse response = httpClient.execute(httpPost, 
               localContext); 
           BufferedReader reader = new BufferedReader(
               new 
           InputStreamReader(response.getEntity().getContent(), 
           "UTF-8")); 

           String sResponse = reader.readLine(); 
           Log.i("info", "test"); 
            } catch (Exception e) { 
           // Log.e("exception", e.printStackTrace()); 
           e.printStackTrace(); 
           showDialog("" + e); 
           } 
           } 
           }); 
           } 


          private void showDialog(String mess) { 
       new AlertDialog.Builder(Android_helloActivity.this).setTitle("Message") 
         .setMessage(mess) 
         .setNegativeButton("Exit", new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface dialog, int which)  { 
           } 
         }).show(); 
} 
} 

答えて

6
mButton.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 

new UploadImageTask().execute(); // initialize asynchronous task 

}}); 

//Now implement Asynchronous Task 


public class Get_User_Data extends AsyncTask<Void, Void, Void> { 

      private final ProgressDialog dialog = new ProgressDialog(
      MyActivity.this); 

    protected void onPreExecute() { 
     this.dialog.setMessage("Loading..."); 
     this.dialog.setCancelable(false); 
     this.dialog.show(); 
    } 
     @Override 
     protected Void doInBackground(Void... params) { 

        uploadImage(); // inside the method paste your file uploading code 
      return null; 
     } 

     protected void onPostExecute(Void result) { 

      // Here if you wish to do future process for ex. move to another activity do here 

      if (dialog.isShowing()) { 
       dialog.dismiss(); 
      } 

     } 
    } 

これは読めないですhttp://vikaskanani.wordpress.com/2011/01/29/android-image-upload-activity/

-3
/** 
* *******Async Task for Use this UTILITY CLASS * 
* pass the file which need to upload * 
* Progress dialog commente/ Uncomment according requirment*******/ 

private class ImageUploaderTask extends AsyncTask<String, Integer, Void> { 
    @Override 
    protected void onPreExecute(){ 
     // simpleWaitDialog = ProgressDialog.show(BlogPostExamplesActivity.this, "Wait", "Uploading Image"); 
    } 
    @Override 
    protected Void doInBackground(String... params) { 
     new ImageUploadUtility().uploadSingleImage(params[0]); 
     return null; 
    } 
    @Override 
    protected void onPostExecute(Void result){ 
     // simpleWaitDialog.dismiss(); 
    } 

    /** 
    * Method uploads the image using http multipart form data. 
    * We are not using the default httpclient coming with android we are using the new from apache 
    * they are placed in libs folder of the application 
    * 
    * @param imageData 
    * @param filename 
    * @return 
    * @throws Exception 
    */ 
    static boolean doUploadinBackground(final byte[] imageData, String filename) throws Exception{ 
     String responseString = null; 
     PostMethod method; 
     method = new PostMethod("your url to upload"); 
     org.apache.commons.httpclient.HttpClient client = new org.apache.commons.httpclient.HttpClient(); 
     client.getHttpConnectionManager().getParams().setConnectionTimeout(
                      100000); 
     FilePart photo = new FilePart("userfile", new ByteArrayPartSource(
                      filename, imageData)); 
     photo.setContentType("image/jpeg"); 
     photo.setCharSet(null); 
     String s = new String(imageData); 
     Part[] parts = { 
      new StringPart("latitude", "123456"), 
      new StringPart("longitude","12.123567"), 
      new StringPart("imei","1234567899"), 
      new StringPart("to_email","some email"), 
      photo 
     }; 
     method.setRequestEntity(new MultipartRequestEntity(parts, method 
                  .getParams())); 
     client.executeMethod(method); 
     responseString = method.getResponseBodyAsString(); 
     method.releaseConnection(); 
     Log.e("httpPost", "Response status: " + responseString); 
     if (responseString.equals("SUCCESS")) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
    /** 
    * Simple Reads the image file and converts them to Bytes 
    * 
    * @param file name of the file 
    * @return byte array which is converted from the image 
    * @throws IOException 
    */ 
    public static byte[] getBytesFromFile(File file) throws IOException { 
     InputStream is = new FileInputStream(file); 
     // Get the size of the file 
     long length = file.length(); 
     // You cannot create an array using a long type. 
     // It needs to be an int type. 
     // Before converting to an int type, check 
     // to ensure that file is not larger than Integer.MAX_VALUE. 
     if (length > Integer.MAX_VALUE) { 
      // File is too large 
     } 
     // Create the byte array to hold the data 
     byte[] bytes = new byte[(int)length]; 
     // Read in the bytes 
     int offset = 0; 
     int numRead = 0; 
     while (offset < bytes.length 
       && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) { 
      offset += numRead; 
     } 
     // Ensure all the bytes have been read in 
     if (offset < bytes.length) { 
      throw new IOException("Could not completely read file "+file.getName()); 
     } 
     // Close the input stream and return bytes 
     is.close(); 
     return bytes; 
    } 
} 
+0

このリンクを参照してください。 4つのスペースでインデントしてコードを書式化してください。 – aliteralmind

関連する問題