Как загрузить большие файлы на сервер PHP в Android

Я пытаюсь загрузить файлы, такие как изображения и песни, на свой PHP-сервер, но когда я пытаюсь загрузить большой файл (размер файла 5 МБ или более), я сталкиваюсь с некоторыми ошибками. Я могу успешно загрузить файлы размером около 500 КБ. Пожалуйста, помогите мне, дайте мне знать, как я могу загрузить файл большого размера ..

Код для java-файла:

public class UploadAudioDemo extends Activity {

    private static final int SELECT_IMAGE = 1, SELECT_AUDIO = 2;
    String selectedPath = "";
    Button ImageBtn, AudioBtn;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ImageBtn = (Button)findViewById(R.id.image_btn);
        AudioBtn = (Button)findViewById(R.id.audio_btn);
        ImageBtn.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent,"Select Image"), SELECT_IMAGE);
            }
        });
        AudioBtn.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent = new Intent();
                intent.setType("audio/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent,"Select Audio"), SELECT_AUDIO);
            }
        });
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (resultCode == RESULT_OK) {
            if (requestCode == SELECT_IMAGE)
            {
                System.out.println("SELECT_IMAGE");
                Uri selectedImageUri = data.getData();
                selectedPath = getPath(selectedImageUri);
                System.out.println("SELECT_IMAGE Path : " + selectedPath);
                doFileUpload();
            }
            else if(requestCode == SELECT_AUDIO)
            {
                System.out.println("SELECT_AUDIO");
                Uri selectedImageUri = data.getData();
                selectedPath = getPath(selectedImageUri);
                System.out.println("SELECT_AUDIO Path : " + selectedPath);
                doFileUpload();
            }
        }
    }

    public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

    private void doFileUpload(){
        HttpURLConnection conn = null;
        DataOutputStream dos = null;
        DataInputStream inStream = null;
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary =  "*****";
        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 1*1024*1024*1024;
        String urlString = "http://abhishekpnf.my3gb.com/test/testupload.php";
        try
        {
            FileInputStream fileInputStream = new FileInputStream(new File(selectedPath) );
            URL url = new URL(urlString);
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.setUseCaches(false);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
            dos = new DataOutputStream( conn.getOutputStream() );
            dos.writeBytes(twoHyphens + boundary + lineEnd);
            dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + selectedPath + "\"" + lineEnd);
            dos.writeBytes(lineEnd);
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            buffer = new byte[bufferSize];
            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);
            }
            dos.writeBytes(lineEnd);
            dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
            Log.v("Debug","File is written");
            fileInputStream.close();
            dos.flush();
            dos.close();
        }
        catch(SocketException ex)
        {
          Log.v("Error : " , "Error on soapPrimitiveData() " + ex.getMessage());
            ex.printStackTrace();
        }
        catch (MalformedURLException ex)
        {
             Log.v("Debug", "error: " + ex.getMessage(), ex);
        }
        catch (IOException ioe)
        {
             Log.v("Debug", "error: " + ioe.getMessage(), ioe);
        }


        try {
              inStream = new DataInputStream ( conn.getInputStream() );
              String str;
              Log.v("Debug","Server Response "+String.valueOf(inStream));
              while (( str = inStream.readLine()) != null)
              {
                   Log.v("Debug","Server Response "+str);
                   Toast.makeText(this, "Status: "+str, Toast.LENGTH_LONG).show();
              }
              inStream.close();
        }
        catch (IOException ioex)
        {
             Log.v("Debug", "error: " + ioex.getMessage(), ioex);
        }
      }
}

Я также включил следующие Uses Permissions:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Логкат:

09-23 12:26:15.676: I/ActivityManager(59): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=pack.coderzheaven/.UploadAudioDemo }
09-23 12:26:15.746: D/AndroidRuntime(522): Shutting down VM
09-23 12:26:15.746: D/dalvikvm(522): Debugger has detached; object registry had 1 entries
09-23 12:26:15.806: I/AndroidRuntime(522): NOTE: attach of thread 'Binder Thread #3' failed
09-23 12:26:21.627: I/ActivityManager(59): Starting activity: Intent { act=android.intent.action.CHOOSER cmp=android/com.android.internal.app.ChooserActivity (has extras) }
09-23 12:26:22.428: I/ActivityManager(59): Displayed activity android/com.android.internal.app.ChooserActivity: 659 ms (total 6698 ms)
09-23 12:26:24.247: I/ActivityManager(59): Starting activity: Intent { act=android.intent.action.GET_CONTENT typ=audio/* flg=0x3000000 cmp=com.android.music/.MusicPicker }
09-23 12:26:24.867: I/ActivityManager(59): Displayed activity com.android.music/.MusicPicker: 599 ms (total 599 ms)
09-23 12:26:27.427: D/AudioSink(34): bufferCount (4) is too small and increased to 12
09-23 12:26:27.652: W/AudioFlinger(34): write blocked for 83 msecs, 98 delayed writes, thread 0xb3d0
09-23 12:26:29.106: W/TimedEventQueue(34): Event 17 was not found in the queue, already cancelled?
09-23 12:26:29.276: I/System.out(507): SELECT_AUDIO
09-23 12:26:29.306: I/System.out(507): SELECT_AUDIO Path : /mnt/sdcard/download/tu_judda.mp3
09-23 12:26:34.986: D/dalvikvm(507): GC_FOR_MALLOC freed 4352 objects / 283128 bytes in 110ms
09-23 12:26:35.076: I/dalvikvm-heap(507): Grow heap (frag case) to 7.707MB for 5277339-byte allocation
09-23 12:26:35.256: D/dalvikvm(507): GC_FOR_MALLOC freed 1424 objects / 83568 bytes in 173ms
09-23 12:26:35.346: D/dalvikvm(507): GC_FOR_MALLOC freed 42 objects / 1888 bytes in 83ms
09-23 12:26:35.516: I/dalvikvm-heap(507): Grow heap (frag case) to 17.693MB for 10554880-byte allocation
09-23 12:26:35.696: D/dalvikvm(507): GC_FOR_MALLOC freed 0 objects / 0 bytes in 178ms
09-23 12:26:35.696: V/Debug(507): File is written
09-23 12:26:39.083: W/ActivityManager(59): Launch timeout has expired, giving up wake lock!
09-23 12:26:39.244: W/ActivityManager(59): Activity idle timeout for HistoryRecord{4504efe8 pack.coderzheaven/.UploadAudioDemo}
09-23 12:26:39.809: D/SntpClient(59): request time failed: java.net.SocketException: Address family not supported by protocol

Я подождал 25-30 минут, но экран остается прежним, и файл не загружается на сервер...

Пожалуйста помоги..


person Abhishek Dhiman    schedule 23.09.2012    source источник
comment
Поиск по SO даст несколько похожих вопросов. Например, Ссылка 1, Ссылка 2, Ссылка 3. Первые 2 ссылки могут помочь.   -  person Siddharth Lele    schedule 23.09.2012
comment
@SiddharthLele И Link1, и Link2 являются отличным учебником, но они не решают мою проблему. Я попытался изменить код в соответствии с инструкциями, но после выполнения размер файла, который я загружаю на сервер, равен 0B. Поэтому, пожалуйста, изучите мой код и помогите мне .. спасибо ..   -  person Abhishek Dhiman    schedule 23.09.2012
comment
Я просто указываю вам правильное направление. У меня нет опыта в этой конкретной области.   -  person Siddharth Lele    schedule 23.09.2012
comment
Спасибо за вашу помощь, но эти уроки для меня бесполезны, так как почти весь код такой же, но я все равно не могу загрузить.   -  person Abhishek Dhiman    schedule 23.09.2012


Ответы (1)


Вы также должны включить следующие разрешения на использование:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
person Rajkumar    schedule 09.05.2014