caricamento di video fino a 50 MB al server

Voglio caricare i video dalle applicazioni Android al server. Quando iam cerca di caricare il video che mostra le mie applicazioni
04-23 13:07:41.602: ERROR/dalvikvm-heap(519): Out of memory on a 15607356-byte allocation. Non so perché l'errore sta accadendo. La mia domanda è posso caricare video di size fino a 50MB utilizzando il codice qui sotto? Se qualcuno sa per favore mi aiuti …

 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 = 8*1024*1024; Cursor c = (MainscreenActivity.JEEMAHWDroidDB).query((MainscreenActivity.TABLE_Name), new String[] { (MainscreenActivity.COL_HwdXml)}, null, null, null, null, null); if(c.getCount()!=0){ c.moveToLast(); for(int i=c.getCount()-1; i>=0; i--) { value=c.getString(0); } } String urlString = value+"/upload_file.php"; try { //------------------ CLIENT REQUEST UUID uniqueKey = UUID.randomUUID(); fname = uniqueKey.toString(); Log.e("UNIQUE NAME",fname); 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=\"" + fname + "."+extension+"" + lineEnd); dos.writeBytes(lineEnd); bytesAvailable = fileInputStream.available(); System.out.println("BYTES:--------->"+bytesAvailable); bufferSize = Math.min(bytesAvailable, maxBufferSize); System.out.println("BUFFER SIZE:--------->"+bufferSize); buffer = new byte[bufferSize]; System.out.println("BUFFER:--------->"+buffer); bytesRead = fileInputStream.read(buffer,0,bufferSize); System.out.println("BYTES READ:--------->"+bytesRead); while (bytesRead > 0) { dos.write(buffer, 0, bufferSize); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); bytesRead = fileInputStream.read(buffer, 0, bufferSize); System.out.println("RETURNED"); } dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); Log.e("Debug","File is written"); fileInputStream.close(); dos.flush(); dos.close(); } catch (MalformsdURLException ex) { Log.e("Debug", "error: " + ex.getMessage(), ex); } catch (IOException ioe) { Log.e("Debug", "error: " + ioe.getMessage(), ioe); } //------------------ read the SERVER RESPONSE try { inStream = new DataInputStream ( conn.getInputStream() ); String str; while (( str = inStream.readLine()) != null) { Log.e("Debug","Server Response "+str); } inStream.close(); } catch (IOException ioex){ Log.e("Debug", "error: " + ioex.getMessage(), ioex); } 

  • RxJava Oggetto con Backpressure - solo lasciare che l'ultimo valore emettere una volta a valle ha finito di consumare
  • Come analizzare una complessa risposta SOAP in Android
  • Il metodo onFrameAvailable () di SurfaceTexture è sempre chiamato troppo tardi
  • Modo affidabile di recuperare dettagli di stato (nome, text di notifica)
  • Testo di text automatico di scala per adattarsi entro i limiti
  • Progresso arrotondato in barra progressiva arrotondata
  • 3 Solutions collect form web for “caricamento di video fino a 50 MB al server”

    prova a sostituire

      bytesAvailable = fileInputStream.available(); System.out.println("BYTES:--------->"+bytesAvailable); bufferSize = Math.min(bytesAvailable, maxBufferSize); System.out.println("BUFFER SIZE:--------->"+bufferSize); buffer = new byte[bufferSize]; System.out.println("BUFFER:--------->"+buffer); bytesRead = fileInputStream.read(buffer,0,bufferSize); System.out.println("BYTES READ:--------->"+bytesRead); while (bytesRead > 0) { dos.write(buffer, 0, bufferSize); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); bytesRead = fileInputStream.read(buffer, 0, bufferSize); System.out.println("RETURNED"); } 

    con

     buffer = new byte[8192]; bytesRead = 0; while ((bytesRead = fileInputStream.read(buffer)) != -1) { dos.write(buf, 0, bytesRead); } 

    Spiegato: read() restituirà il numero di byte che legge o -1 se la fine del stream è raggiunta e non è ansible leggere ulteriori dati. Inoltre riempie i primi byte N di buffer con i dati che ha letto. La syntax (a = b) != c assegna prima b a a, quindi confronta il valore con c (qui: eseguire read , assegnare risultato a bytesRead , confrontare a -1 ). Pertanto il ciclo viene eseguito finché each byte viene letto dall'inizio alla fine del stream.

    Dopo each read i dati nel buffer vengono scritti tramite write . Dal momento che sappiamo da byte bytesRead quanto byte in buffer sono effettivamente leggere di byte di nuovo direi write scrivere solo i byte da 0 a bytesRead . Non è necessario controllare InputStream.available() (che può anche restituire risultati senza significato se la lunghezza del stream non è nota) o qualsiasi altro metodo.

    Nota: cambiandolo a while (bytesRead > 0) introduce una sottile differenza. Si interrompe la lettura se si leggono 0 byte ma non hanno raggiunto la fine del stream. Quel caso è legale, anche se è abbastanza sicuro assumere che non accada. Sei più sicuro se usi bytesRead >= 0 però.

    Ciò significa che si esaurisce la memory. Cercate di ridurre l'utilizzo della memory riducendo la dimensione del buffer:

     int maxBufferSize = 2*1024*1024; 

    anche dopo aver utilizzato questo codice avrai lo stesso errore "fuori memory" in questo caso dovresti utilizzare l'entity framework; httppost e multipart per submit i tuoi dati …

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.