输出流写入不在Android中返回

时间:2013-12-09 23:08:42

标签: android file-upload httpurlconnection

我使用Android中的HttpsURLConnection类将文件上传到服务器。我正在使用PUT方法。在正常情况下它工作正常,但是当我试图将文件写入服务器中没有写权限的文件夹时,write方法应该失败然后当我使用getResponseCode()时我应该收到403 Forbidden来自服务器的响应。我必须使用403响应向用户显示“No Permissions”消息。

现在,当我上传的文件大小小于缓冲区大小(16K)时,write方法返回并且getResponseCode返回403.但是,当文件大小较大时(通常是这种情况),程序卡在write方法中,因此根本没有到达getResponseCode。包括模拟器在内的所有Android设备都会发生这种情况。

以下是代码段:

HttpsURLConnection connection = getSSLChannel();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setConnectTimeout(connectionTimeout);
connection.setReadTimeout(readTimeout);
connection.setUseCaches(false);
connection.setRequestMethod("PUT");
connection.setFixedLengthStreamingMode(size);
connection.setRequestProperty("Connection", "Keep-Alive");
OutputStream out = connection.getOutputStream();


    try{
        int count =0;       
        long progress = 0;
        byte[] chunkData = new byte[16384];
        long fileSize = localFile.getLocalFileSize();
        bis = getSourceBufferedStream();

        while (((nRead = bis.read(chunkData)) != -1)) {
            if(nRead < chunkData.length){
            byte[] newBytes = Arrays.copyOf(chunkData, nRead);
            out.write(newBytes, 0, nRead);
            count++;
            }else{
                out.write(chunkData, 0, nRead);
                count++;
            }
        }

        out.flush();
    }finally{
        if(out != null){
            try {
                out.close();
                out = null;
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
    int resCode = connection.getResponseCode();
    System.out.println("Res Code :" + resCode);
}

我在finally块中放了一个调试指针。但该应用程序永远不会进入finally块。

有些观点: 1.服务器不支持分段上传。 2.如果文件夹在服务器上具有写入权限,则没有单独的Web服务可以找到。 3.在iOS中这很好用。我能收到403。 我曾尝试过Fiddler,也给了我一个403。 5.此外,在快速网络中(如果服务器位于本地wifi域中),我有时可以获得403.

我做错了什么?请帮忙 !

感谢。

0 个答案:

没有答案