Autore Topic: Problemi invio file > 10MB  (Letto 508 volte)

Offline x69asterix2

  • Utente junior
  • **
  • Post: 127
  • Respect: +1
    • Mostra profilo
Problemi invio file > 10MB
« il: 13 Marzo 2015, 09:43:53 CET »
0
sto provando un modo alternativo per inviare un file ad un server "php"
Il codice è questo è funziona ad eccezione del fatto che per i file > 10M
il file non viene inviato e l'app va in crash.
Codice: [Seleziona]
public int uploadFile(String 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 :" +imagePath);
            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() {

                            Toast.makeText(getApplicationContext(), "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() {

                        Toast.makeText(getApplicationContext(), "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() {

                        Toast.makeText(getApplicationContext(), "Got Exception : see logcat ",
                                Toast.LENGTH_SHORT).show();
                    }
                });
              //  Log.e("Upload file to server Exception", "Exception : " + e.getMessage());
            }
    //        dialog.dismiss();
            return serverResponseCode;

        } // End else block
    }


.htaccess
Codice: [Seleziona]
# av:PHP-upload
php_value upload_max_filesize 50M
php_value post_max_size 50M
php_value max_execution_time 50000
php_value max_input_time 50000
# PHP-upload

script php
Codice: [Seleziona]
<?php
    $file_path = "uploads/";

    $file_path = $file_path . basename( $_FILES['uploaded_file']['name']);
    if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $file_path)) {
        echo "success";
    } else{
        echo "fail";
    }
 ?>

logcat.
Codice: [Seleziona]
E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-2177
    java.lang.OutOfMemoryError
            at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91)
            at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:201)
            at libcore.net.http.RetryableOutputStream.write(RetryableOutputStream.java:61)
            at java.io.DataOutputStream.write(DataOutputStream.java:98)
            at .Impostazioni.uploadFile(Impostazioni.java:738)
            at .Impostazioni$6$1.run(Impostazioni.java:247)
            at java.lang.Thread.run(Thread.java:856)
Avete qualche idea del perchè?

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Problemi invio file > 10MB
« Risposta #1 il: 13 Marzo 2015, 10:22:56 CET »
0
Va in outofmemory, è troppo grande il file che devi inviare.

Il metodo post non è il più adatto per un upload di grosse dimensioni, perchè non continui con ftp?
Se la mia risposta ti è utile, per favore un thanks!

Offline x69asterix2

  • Utente junior
  • **
  • Post: 127
  • Respect: +1
    • Mostra profilo
Re:Problemi invio file > 10MB
« Risposta #2 il: 13 Marzo 2015, 10:42:20 CET »
0
Ciao LonelyWolf,
perchè penso che altri utenti che useranno l'app con il wifi possano avere problemi con la configurazione del router (21)o del firewall.
Probabilmente è solo un mia sega mentale.
Poi ho notato che l'ftp impiega + tempo rispetto al metodo POST.
Per il metodo POST c'è un limite di grandezza da rispettare?

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Problemi invio file > 10MB
« Risposta #3 il: 13 Marzo 2015, 11:11:53 CET »
0
Di solito il protocollo ftp non ha problemi con nessun router/firewall a meno che non sia stato specificatamente bloccato da qualcuno; il metodo post ha i limiti impostati dalla configurazione del webserver e non c'è uno standard.

Io con nessun router ho mai avuto problemi usando ftp in "uscita".
Se la mia risposta ti è utile, per favore un thanks!

Offline x69asterix2

  • Utente junior
  • **
  • Post: 127
  • Respect: +1
    • Mostra profilo
Re:Problemi invio file > 10MB
« Risposta #4 il: 13 Marzo 2015, 11:19:02 CET »
0
ok.
Se non ricordo male tu usi una libreria per l'ftp, io uso ftp4j
che funziona bene unica pecca è che non è prevista una progressbar.
Nella tua libreria esiste la possibilità di visualizzare l'avanzamento di quanto inviato?

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Problemi invio file > 10MB
« Risposta #5 il: 13 Marzo 2015, 11:38:58 CET »
0
No è una libreria che fornisce supporto per connessioni (ftp,udp,pop3, ecc), però ho trovato un post che spiega come aggiungerla, sembra semplice.

FTP apache commons progress bar in java - Stack Overflow
Se la mia risposta ti è utile, per favore un thanks!

Offline x69asterix2

  • Utente junior
  • **
  • Post: 127
  • Respect: +1
    • Mostra profilo
Re:Problemi invio file > 10MB
« Risposta #6 il: 13 Marzo 2015, 11:46:13 CET »
0
ma secondo te è adattabile alla mia libreria?
il codice:
Codice: [Seleziona]
CopyStreamAdapter streamListener = new CopyStreamAdapter() {

    @Override
    public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) {
       //this method will be called everytime some bytes are transferred

       int percent = (int)(totalBytesTransferred*100/yourFile.length());
       // update your progress bar with this percentage
    }

 });
ftp.setCopyStreamListener(streamListener);

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Problemi invio file > 10MB
« Risposta #7 il: 13 Marzo 2015, 12:04:10 CET »
0
Non conosco la tua libreria, magari già fornisce i dati per una progressbar, devi cercare nella documentazione.
Se la mia risposta ti è utile, per favore un thanks!

Offline x69asterix2

  • Utente junior
  • **
  • Post: 127
  • Respect: +1
    • Mostra profilo
Re:Problemi invio file > 10MB
« Risposta #8 il: 15 Marzo 2015, 12:22:42 CET »
0
Stò provando ad utilizzare la libreria org.apache.commons.net.ftp, per visualizzare l'avanzamento dei dati trasferiti
ma non ottengo nessun progresso, questo è il mio codice:
Codice: [Seleziona]
  @Override
        protected String doInBackground(String... params) {
     ftp();
     return null;
        }

private void ftp() {
        final org.apache.commons.net.ftp.FTPClient ftp = new org.apache.commons.net.ftp.FTPClient();
        try {
            ftp.connect(FTP_HOST);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            ftp.login(FTP_USER, FTP_PASS);
        } catch (IOException e) {
            e.printStackTrace();
        }
        ftp.enterLocalPassiveMode();
        try {
            ftp.setFileType(FTP.BINARY_FILE_TYPE);

        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            ftp.changeWorkingDirectory("/uploads/xx/xx/");
        } catch (IOException e) {
            e.printStackTrace();
        }
        int reply = ftp.getReplyCode();

        if (FTPReply.isPositiveCompletion(reply)) {
            //     addLog("Uploading...");
        } else {
            //      addLog("Failed connection to the server!");
        }

        File f1 = new File(imagePath);
        BufferedInputStream bis = null;
        try {
            bis = new BufferedInputStream(new FileInputStream(f1));
        //    ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out), true));
        //    ftp.setCopyStreamListener(createListener());

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            ftp.storeFile(fileName, bis);
            ftp.setCopyStreamListener(streamListener);


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

        //  addLog("Done");

        try {
            ftp.logout();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            ftp.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    CopyStreamAdapter streamListener = new CopyStreamAdapter() {

        @Override
        public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) {
            //this method will be called everytime some bytes are transferred

            int percent = (int)(totalBytesTransferred*100/fileName.length());
            // update your progress bar with this percentage
            Log.d("Progress2", String.valueOf(percent));
        }

    };

cosa c'è di sbagliato?