Android上传大文件

标签 android http upload

我是 Android 开发的新手,我正在尝试将大小为 25 到 50 MB 的文件上传到 Web 服务器,但出现内存不足错误。过去 2 天我一直在苦苦挣扎,不知道哪里出了问题。

对我出错的地方有什么建议吗?

我正在处理的代码是

private FileInputStream fileInputStream = null;
private int bytesavailable,buffersize,bytesRead ;
byte buff[];
int maxBufferSize = 1*1024*1024;
String server_url ="server_url";
DataOutputStream dos;
String Builder response = new String Builder();
String body = "boundary values";
String body2 = "Boundary values";
URL url = null;
    try 
    {
        url = new URL(server_url);
    } 
    catch (MalformedURLException e1) 
    {
        e1.printStackTrace();
    }

    HttpURLConnection conn = null;
    try 
    {
        conn = (HttpURLConnection) url.openConnection();
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }
    try 
    {
        conn.setRequestMethod("POST");
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setRequestProperty("Connection","Keep-Alive");
        conn.setRequestProperty("Content-Type","multipart/form-data; boundary=A300x");
        conn.connect();
        dos = new DataOutputStream(conn.getOutputStream());
        dos.writeBytes(body);
        File inputfile = new File(sourceFile);
        fileInputStream = new FileInputStream(inputfile);


        bytesavailable = fileInputStream.available();
        buffersize = Math.min(bytesavailable, maxBufferSize);
        buff = new byte[buffersize];
        bytesRead = fileInputStream.read(buff, 0, buffersize);


            while (bytesRead > 0) 
            {

                dos.write(buff, 0, buffersize);
                dos.flush();
                bytesavailable = fileInputStream.available();
                buffersize = Math.min(bytesavailable, maxBufferSize);
                bytesRead = fileInputStream.read(buff, 0, buffersize);
            }
        fileInputStream.close();
        dos.write("\r\n".getBytes());
        dos.write(body2.getBytes());
        dos.flush();
        dos.close();
} 
    catch (ProtocolException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    int iresponse = 0;
    try 
    {
        iresponse = conn.getResponseCode();
    } 
    catch (IOException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    //printStream(conn.getInputStream());

    if (iresponse == HttpURLConnection.HTTP_OK) 
    {

        BufferedReader input = null;
        try 
        {
            input = new BufferedReader(new InputStreamReader(conn.getInputStream()), 8192);
        } 
        catch (IOException e1) 
        {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        String line = null;
        try 
        {
            while ((line = input.readLine()) != null)
                response.append(line);
        } 
        catch (IOException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try 
        {
            input.close();
        } 
        catch (IOException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    return response.toString();

最佳答案

这可能会有帮助。

private void uploadFile(File file) throws IOException {
    Log.i(TAG, "Uploading " + file);
    String videoName = file.getParentFile().getName();

    AndroidHttpClient httpclient = AndroidHttpClient.newInstance(GoProLive.TAG);
    try {
        HttpConnectionParams.setConnectionTimeout(httpclient.getParams(), ConnectTimeout);
        HttpConnectionParams.setSoTimeout(httpclient.getParams(), DataTimeout);
        HttpPost post = new HttpPost(
                String.format("http://" + ServerName + "/upload/%s/%s", user.getUsername(), file.getName()));
        post.setEntity(new FileEntity(file, "application/octet-stream"));

        SimpleDateFormat df = (SimpleDateFormat) SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.SHORT, Locale.US);
        df.applyPattern("EEE, dd MMM yyyy HH:mm:ss z");
        post.setHeader("Last-Modified", df.format(new Date(file.lastModified())));
        HttpResponse httpResponse = executePost(httpclient, post);
        int statusCode = httpResponse.getStatusLine().getStatusCode();
        if (statusCode == HttpStatus.SC_OK) {
            file.delete();
        } else {
            throw new HttpException("Failed to upload file " + file.getAbsolutePath(), statusCode);
        }
    } finally {
        httpclient.close();
    }
}

关于Android上传大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9660430/

相关文章:

jquery - 使用 jQuery 通过表单数据上传文件时出错

PHP发送邮件附件

php - Laravel 5,尝试多文件上传,Request::file() 只返回最后一个文件?

android - 为什么一个按钮可以添加多个ClickListener

java - 如何在 Android 应用程序中显示 "highlighted area"

http - 如何禁用内容长度检查?

Python HTTP POST 请求发送两次

java - 在TextView中将drawable设置为文本末尾

android - auto 和 preferExternal 安装位置 Android list 之间的区别

apache - .htaccess 从子目录重写到根目录