2013-11-25 267 views
1

我想我的文件上傳到服務器,我試圖與文件上傳到服務器自動

public class UploadFiles extends Activity { 

TextView messageText; 
Button uploadButton; 
int serverResponseCode = 0; 
ProgressDialog dialog = null; 

String upLoadServerUri = null; 

final String uploadFilePath = "mypath"; 
final String uploadFileName = "myfile"; 


@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_server); 

    uploadButton = (Button)findViewById(R.id.uploadButton); 
    messageText = (TextView)findViewById(R.id.messageText); 

    messageText.setText("Uploading file path :- 'path"+uploadFileName+"'"); 


    upLoadServerUri = "serverpath"; 

    uploadButton.setOnClickListener(new OnClickListener() 
    {    
     @Override 
     public void onClick(View v) 
     { 

      dialog = ProgressDialog.show(UploadToServer.this, "", "Uploading file...", true); 

      new Thread(new Runnable() 
      { 
        public void run() 
        { 
         runOnUiThread(new Runnable() 
         { 
           public void run() 
           { 
            messageText.setText("uploading started....."); 
           } 
          });      

         uploadFile(uploadFilePath + "" + uploadFileName); 

        } 
        }).start();   
      } 
     }); 
} 

public int uploadFile(String sourceFileUri) 
{ 


     String fileName = sourceFileUri; 

     HttpURLConnection conn = null; 
     DataOutputStream dos = null; 
     String lineEnd = "\r\n"; 
     String twoHyphens = "--"; 
     String boundary = "*****"; 
     int bytesRead, bytesAvailable, bufferSize; 
     byte[] buffer; 
     int maxBufferSize = 1 * 1024 * 1024; 
     File sourceFile = new File(sourceFileUri); 

     if (!sourceFile.isFile()) 
     { 

      dialog.dismiss(); 

      Log.e("uploadFile", "Source File not exist :" 
           +uploadFilePath + "" + uploadFileName); 

      runOnUiThread(new Runnable() 
      { 
       public void run() 
       { 
        messageText.setText("Source File not exist :" +uploadFilePath + "" + uploadFileName); 
       } 
      }); 

      return 0; 

     } 
     else 
     { 
      try 
      { 

       // open a URL connection to the Servlet 
       FileInputStream fileInputStream = new FileInputStream(sourceFile); 
       URL url = new URL(upLoadServerUri); 

       // Open a HTTP connection to the URL 
       conn = (HttpURLConnection) url.openConnection(); 
       conn.setDoInput(true); // Allow Inputs 
       conn.setDoOutput(true); // Allow Outputs 
       conn.setUseCaches(false); // Don't use a Cached Copy 
       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", fileName); 

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

       dos.writeBytes(twoHyphens + boundary + lineEnd); 
       dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\"" 
             + fileName + "\"" + 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); 

       // Responses from the server (code and message) 
       serverResponseCode = conn.getResponseCode(); 
       String serverResponseMessage = conn.getResponseMessage(); 

       Log.i("uploadFile", "HTTP Response is : " 
         + serverResponseMessage + ": " + serverResponseCode); 

       if(serverResponseCode == 200) 
       { 

        runOnUiThread(new Runnable() 
        { 
         public void run() 
         { 

          String msg = "File Upload Completed.\n\n See uploaded file here : \n\n"+" serverpath" 
              +uploadFileName; 

          messageText.setText(msg); 
          Toast.makeText(UploadToServer.this, "File Upload Complete.", 
             Toast.LENGTH_SHORT).show(); 
         } 
        });     
       }  

       //close the streams // 
       fileInputStream.close(); 
       dos.flush(); 
       dos.close(); 

      } 
      catch (MalformedURLException ex) 
      { 

       dialog.dismiss(); 
       ex.printStackTrace(); 

       runOnUiThread(new Runnable() 
       { 
        public void run() 
        { 
         messageText.setText("MalformedURLException Exception : check script url."); 
         Toast.makeText(UploadToServer.this, "MalformedURLException", Toast.LENGTH_SHORT).show(); 
        } 
       }); 

       Log.e("Upload file to server", "error: " + ex.getMessage(), ex); 
      } 
      catch (Exception e) 
      { 

       dialog.dismiss(); 
       e.printStackTrace(); 

       runOnUiThread(new Runnable() 
       { 
        public void run() 
        { 
         messageText.setText("Got Exception : see logcat "); 
         Toast.makeText(UploadToServer.this, "Got Exception : see logcat ", 
           Toast.LENGTH_SHORT).show(); 
        } 
       }); 
       Log.e("Upload file to server Exception", "Exception : " 
               + e.getMessage(), e); 
      } 
      dialog.dismiss();  
      return serverResponseCode; 

     } 
    } 
} 

,因此我在上傳文件成功。現在我想讓我的文件在特定的時間間隔上自動上傳到服務器上。對於這個我搜索了一下,發現了關於處理程序和定時器,但我仍然無法找到如何實現這一點。我想每上班1小時在服務器上放置我的文件。任何人都可以幫助我如何做到這一點,作爲一個新手。提前致謝。

+0

u可以使用計時器和運行上傳的的AsyncTask – KOTIOS

+0

ü可以上傳我一些例子值編碼,這樣我可以瞭解更多更好的 – AndroidOptimist

+0

你有什麼要求?因爲有很多方法來處理這種情況。你希望你的應用在每小時上傳一次的同時在後臺運行嗎? – saiful103a

回答

0

這爲我工作:此代碼運行在UI

final Handler handler = new Handler(); 
    Timer timer = new Timer(); 
    TimerTask doAsynchronousTask = new TimerTask() {  
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() {  
        try { 
         // call ur AsyncTask 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer.schedule(doAsynchronousTask, 0, 50000); //execute in every 50000 ms 
} 
+0

在這裏嘗試塊我需要添加我的方法?以及如何在onclick中調用此處理程序方法? – AndroidOptimist

+0

是的,你需要在嘗試塊中調用ur方法 – KOTIOS

+0

如何在onclick和try塊中調用uploadfile()方法是可能的? – AndroidOptimist

0

下面有方法來啓動計劃的任務。 refreshTime以毫秒爲單位,因此將1小時轉換爲millisecons。首先調用這個方法onCreate或者你需要的地方,然後方法將被自動調用(使用處理程序)。

public Timer tvShowsRefreshTimer = new Timer(); 

private void launchScheduledTask(int refreshTime) { 
     tvShowsRefreshTimer.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       myScheduledTask(refreshHandler); 
      } 
     }, refreshTime); 
} 

更重要的是,你需要處理程序將自動完成所有的工作:

public Handler refreshHandler= new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     launchScheduledTask(3600000); //task after 1 hour 
     super.handleMessage(msg); 
    } 
}; 

而且不要忘記郵處理消息你的工作完成之後。此代碼(以下)從myScheduledTask方法中調用:

handler.sendEmptyMessage(1); 

這就是您所需要的。把你的代碼放到myScheduledTask方法,做你的工作:)

+0

當我正在執行此oncreate它會拋出錯誤,如無效修飾符 – AndroidOptimist

+0

嘗試將以上所有代碼移到onCreate外部。在onCreate你只能調用launchScheduledTask(60000);//第一次啓動將在一分鐘後。 – Ragaisis