Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android allow multiple file upload (Max 150 MB) to PHP Server

I have to allow a user to upload multiple files(can be image/video/audio)in a single request from my android application to the PHP server. I am using REST web service.

For this functionality, I am using the following code:

/* To upload the multiple documents */
public void uploadFile() {
    String charset = "UTF-8";
    File[] uploadFileArray = new File[mediaList.size()];

    for (int i = 0; i < mediaList.size(); i++) {
        uploadFileArray[i] = new File(mediaList.get(i).getMediaPath());
    }

    try {
        MultipartUtility multipart = new MultipartUtility(upLoadServerUri, charset);

        for (int i = 0; i < mediaList.size(); i++) {
            if (isImage)) {
                multipart.addFilePart("image_doc[]", uploadFileArray[i]);
            } 
            else if (isVideo) {
                multipart.addFilePart("video_doc[]", uploadFileArray[i]);
            } 
            else if (isAudio) {
                multipart.addFilePart("audio_doc[]", uploadFileArray[i]);
            }
        }

        List<String> responseUploadDocument = multipart.finish();
        System.out.println("SERVER REPLIED:");

        for (String line : responseUploadDocument) {
            System.out.println(line);
            responseUploadDocumentString = line;
        }

        if (responseUploadDocumentString != null) {
            JSONObject jsonObj = new JSONObject(responseUploadDocumentString);
            statusUploadDoc = jsonObj.getString("status");
        }

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

And my MultipartUtility Class is as follows:

public class MultipartUtility {
    private final String boundary;
    private static final String LINE_FEED = "\r\n";
    private HttpURLConnection httpConn;
    private String charset;
    private OutputStream outputStream;
    private PrintWriter writer;

    public MultipartUtility(String requestURL, String charset)
            throws IOException {
        this.charset = charset;

        boundary = "===" + System.currentTimeMillis() + "===";

        URL url = new URL(requestURL);
        httpConn = (HttpURLConnection) url.openConnection();

        ***httpConn.setChunkedStreamingMode(0);***
        httpConn.setUseCaches(false);
        httpConn.setDoOutput(true); // indicates POST method
        httpConn.setDoInput(true);

        httpConn.setRequestProperty("Content-Type",
                "multipart/form-data; boundary=" + boundary);
        httpConn.setRequestProperty("User-Agent", "CodeJava Agent");
        httpConn.setRequestProperty("Test", "Bonjour");

        outputStream = httpConn.getOutputStream();
        writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),
                true);
    }

    public void addFormField(String name, String value) {
        writer.append("--" + boundary).append(LINE_FEED);
        writer.append("Content-Disposition: form-data; name=\"" + name + "\"")
                .append(LINE_FEED);
        writer.append("Content-Type: text/plain; charset=" + charset).append(
                LINE_FEED);
        writer.append(LINE_FEED);
        writer.append(value).append(LINE_FEED);
        writer.flush();
    }

    public void addFilePart(String fieldName, File uploadFile)
            throws IOException {
        String fileName = uploadFile.getName();
        writer.append("--" + boundary).append(LINE_FEED);
        writer.append(
                "Content-Disposition: form-data; name=\"" + fieldName
                        + "\"; filename=\"" + fileName + "\"")
                .append(LINE_FEED);
        writer.append(
                "Content-Type: "
                        + URLConnection.guessContentTypeFromName(fileName))
                .append(LINE_FEED);
        writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
        writer.append(LINE_FEED);
        writer.flush();

        FileInputStream inputStream = new FileInputStream(uploadFile);
        byte[] buffer = new byte[4096];
        int bytesRead = -1;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        outputStream.flush();
        inputStream.close();

        writer.append(LINE_FEED);
        writer.flush();
    }

    public void addHeaderField(String name, String value) {
        writer.append(name + ": " + value).append(LINE_FEED);
        writer.flush();
    }

    public List<String> finish() throws IOException {
        List<String> response = new ArrayList<String>();

        writer.append(LINE_FEED).flush();
        writer.append("--" + boundary + "--").append(LINE_FEED);
        writer.close();

        // checks server's status code first
        int status = httpConn.getResponseCode();
        if (status == HttpURLConnection.HTTP_OK) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    httpConn.getInputStream()));
            String line = null;
            while ((line = reader.readLine()) != null) {
                response.add(line);
            }
            reader.close();
            httpConn.disconnect();
        } else {
            throw new IOException("Server returned non-OK status: " + status);
        }

        return response;
    }
}

But now the problem is:

On Local Server:

  • Allow to upload till 16MB [if setChunkedStremmingMode(0) is not set]
  • Allow to upload till 150MB [if setChunkedStremmingMode(0) is set]

On Live Server:

  • Allow to upload till 16MB [if setChunkedStremmingMode(0) is not set]
  • Disallow to upload a single KB file [if setChunkedStremmingMode(0) is set]

My both local and live servers have the same configurations. I don't understand why setChunkedStremmingMode(0) doesn't work for the live server.

like image 534
Manali Sheth Avatar asked May 14 '15 17:05

Manali Sheth


People also ask

How can I increase the maximum upload file size in PHP?

To increaes file upload size in PHP, you need to modify the upload_max_filesize and post_max_size variable's in your php. ini file. In addition, you can also set the maximum number of files allowed to be uploaded simultaneously, in a single request, using the max_file_uploads .

How can I upload large files over 500mb in PHP?

By changing the upload_max_filesize limit in the php. ini file. By implementing file chunk upload, that splits the upload into smaller pieces an assembling these pieces when the upload is completed.

What is the maximum file uploading limit in PHP?

The default PHP values are 2 MB for upload_max_filesize, and 8 MB for post_max_size.

How do I increase my server upload limit?

Open the file in any text editor and add the following code. @ini_set( 'upload_max_size' , '20M' ); @ini_set( 'post_max_size', '13M'); @ini_set( 'memory_limit', '15M' ); Save your changes, and it should increase your file upload size.


1 Answers

I have a project which can upload image/file size of up to 48-50 MB. [I'm using Retrofit for Network communication.] Here is the link to the Sample Project: https://github.com/DearDhruv/Retrofit-with-EventBus

Here is code:

private void startUploading(final File file) {

    if (file == null || !isPictureValid(file.getAbsolutePath())) {
        showMsg("File is not valid, try again.");
    } else if (file.exists()) {
        showProgressDialog();
        String mimeType = "image/jpeg"
                // "application/octet-stream"
                // "multipart/form-data"
                // "image/*"
                // "multipart/mixed"
                ;

        TypedFile typedFile = new TypedFile(mimeType, file);
        mApiClient.uploadFile(UPLOAD_FILE_REQUEST_TAG, typedFile);

    } else {
        showMsg("File is corrupted.");
    }
}

Here is server-side code:

class ImageUploadStatus {
    public $result_code = 0;
    public $message = "Image upload failed.";}
    class ImageResults {
    public $name = "";
    public $url = "";
    public $size = "";
}
$status = new ImageUploadStatus ();
$results = new ImageResults ();

if ($_FILES ["file"] ["error"] > 0) {
    header ( "HTTP/1.1 400 Bad Request" );
    // echo "Error: " . $_FILES ["file"] ["error"] . "<br /> \n";
    $status->message = "Error: " . $_FILES ["file"] ["error"];
} else {
    if ($_FILES ["file"] ["error"] > 0) {
        // echo "Error: " . $_FILES ["file"] ["error"] . "<br /> \n";
        $status->message = "Error: " . $_FILES ["file"] ["error"];
    } else {
        // echo "Upload: " . $_FILES ["file"] ["name"] . "<br /> \n";
        // echo "Type: " . $_FILES ["file"] ["type"] . "<br /> \n";
        // echo "Size: " . ($_FILES ["file"] ["size"] / 1024) . " Kb<br /> \n";
        // echo "Stored in: " . $_FILES ["file"] ["tmp_name"] . "<br /> \n";
    }

    $target_path = "../api/uploads/";
    $target_path = $target_path . basename ( $_FILES ['file'] ['name'] );

    //if (is_uploaded_file ( $_FILES ['uploadedfile'] ['tmp_name'] )) {
        // echo "There was an error uploading the file, please try again!";
        //$status->message = "There was an error uploading the file, please try again!";
    //}

    if (move_uploaded_file ( $_FILES ['file'] ['tmp_name'], $target_path )) {
        // echo "The file " . basename ( $_FILES ['file'] ['name'] ) . " has been uploaded";

        $status->message = "Image upload successful";
        $status->result_code = 1;

        $results->name = $_FILES ["file"] ["name"] . "";
        $results->url = $target_path . "";
        $results->size = ($_FILES ["file"] ["size"] / 1); // 1024 to convert in KB
    } else {
        // echo "There was an error Moving the file, please try again!";
        //$status->message = "There was an error Moving the file, please try again!";

         switch($_FILES['file']['error']){
            case 0: //no error; possible file attack!
              $status->message =  "There was a problem with your upload.";
              break;
            case 1: //uploaded file exceeds the upload_max_filesize directive in php.ini
              $status->message =  "The file you are trying to upload is too big.";
              break;
            case 2: //uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form
              $status->message =  "The file you are trying to upload is too big.";
              break;
            case 3: //uploaded file was only partially uploaded
                $status->message =  "The file you are trying upload was only partially uploaded.";
              break;
            case 4: //no file was uploaded
              $status->message =  "You must select an image for upload.";
              break;
            default: //a default error, just in case!  :)
              $status->message =  "There was a problem with your upload.";
              break;
          }

        }

    $response = array (
            'status' => $status,
            'results' => $results 
    );

    // echo (json_encode ( $status ));
    // echo (json_encode ( $results ));
    echo (json_encode ( $response ));
}

I guess this might be helpful.

You might also need to give the max size of upload file in PHP configuration.

like image 163
DearDhruv Avatar answered Nov 14 '22 01:11

DearDhruv