android - 将文件上传到 asp.net 服务器的进度条

标签 android file-upload android-asynctask progress-bar

我制作了一个将视频上传到 asp.net 服务器的程序。然后我想通过添加进度条来开发我的应用程序。但是,添加进度条后,我无法将文件上传到服务器。(这是我调试后得到的结果!!!!)你能帮我看看我的代码有什么问题吗?

package com.isoft.uploader2;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class Proje2Activity extends Activity
{
 @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button button =(Button)findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                openGaleryVideo();
            }
        });

    }
/** Called when the activity is first created. */
public static final int SELECT_VIDEO=1;
public static final String TAG="UploadActivity";
String path="";

//Gallery'i aç
public void openGaleryVideo()
{
    Intent intent=new Intent();
    intent.setType("video/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Video"),SELECT_VIDEO);
}

//Dosyayı seç ve yükle
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK)
    {
        if (requestCode == SELECT_VIDEO) 
        {
            Uri videoUri = data.getData();
            path= getPath(videoUri);
            upload a = new upload();
            a.onPreExecute();
            a.doInBackground();
            a.onProgressUpdate();


        }
    }
}

//SD carddan yerini al
public String getPath(Uri uri)
{   
    String[] projection = { MediaStore.Video.Media.DATA};
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}
public class upload extends AsyncTask<Object, Integer, Void> 
{
     public ProgressDialog dialog;
     File file=new File(path);  
     String urlServer = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
     String filename=file.getName();
     int bytesRead, bytesAvailable, bufferSize;
     byte[] buffer;
     int maxBufferSize = 20*1024*1024;
    @Override
    public void onPreExecute() 
    {
         dialog = new ProgressDialog(Proje2Activity.this);
         dialog.setMessage("Uploading...");
         dialog.setIndeterminate(false);
         dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
         dialog.setProgress(0);
         dialog.show();
            //Burada işlemi yapmadan önce ilk olarak ne yaptırmak istiyorsak burada yaparız.
            //Örneğin burada dialog gösterip "onPostExecute()" metodunda dismiss edebiliriz.
    }

    @Override
    public Void doInBackground(Object... arg0) 
    {
        // TODO Auto-generated method stub
        try
        {
        FileInputStream fileInputStream = new FileInputStream(file);

        URL url = new URL(urlServer);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setFixedLengthStreamingMode((int) file.length());

        // Allow Inputs & Outputs
        connection.setDoInput(true);
        connection.setDoOutput(true);
        connection.setUseCaches(false);

        // Enable POST method
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setRequestProperty("Content-Type",  "multipart/form-data");
        connection.setRequestProperty("SD-FileName", filename);//This will be the file name
        DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
        bytesAvailable = fileInputStream.available();
        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        buffer = new byte[bufferSize];

        // Read file
        bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        while (bytesRead > 0)
        {   
            outputStream.write(buffer, 0, bufferSize);
            bytesAvailable = fileInputStream.available();
            publishProgress();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        }//end of while statement
        fileInputStream.close();
        publishProgress(100); 
        outputStream.flush();
        outputStream.close();
        }//end of try body
        catch (Exception ex)
        {
            //ex.printStackTrace();
            Log.e("Error: ", ex.getMessage());
        }
        return null;
     }//end of doInBackground method
     @Override
     public void onProgressUpdate(Integer... values) 
     {
       // TODO Auto-generated method stub
       dialog.setProgress((int) ((file.length()-bytesRead)/100));
     }//end of onProgressUpdate method
}// end of asyncTask class 
}//end of main

最佳答案

你必须像这样调用上传任务

new Upload().execute();

而且你没有像你那样调用 asynTask 做正确的事

所以你的代码看起来像下面这样

Upload a = new Upload();
a.execute 

代替

upload a = new upload();
            a.onPreExecute();
            a.doInBackground();
            a.onProgressUpdate();

如果您上传文件的代码是正确的,这将起作用

如果你想更新进度条使用Handler类

Handler handler = new Handler(){
    @Override 
    public void handleMessage(int what){
        mProgress.setProgress(mProgressStatus);
     }

ProgressBar widget 中所述

然后在 doInBackground() 方法中调用方法 publishProgress(),如此处所述 AsyncTask Docs

关于android - 将文件上传到 asp.net 服务器的进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11312645/

相关文章:

java - Gson- 将 JSON 对象的 JSON 数组解析为 ArrayList<org.json.JSONObject>

android - ViewPager setCurrentItem(pageId, true) 不平滑滚动

android - 混淆将代码放入 AsyncTask

java - Android中两个并发的AsyncTasks-如何处理竞争条件?

java - 如何仅在验证用户名和密码正确后才启动后台任务中的 Activity ?

android - 键盘隐藏 Android React Native webview 的内容

android - 我可以将 Snackbar 放在底部导航上方吗?

javascript - XMLHttpRequest.upload 进度事件仅适用于 IE

c# - 获取发布的文件扩展名 asp.net

java - Selenium (Java) - Chrome Headless - 无法上传文件