Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通过网络/本地主机发送大文件_Android_Inputstream_Large Files_Outputstream - Fatal编程技术网

Android 通过网络/本地主机发送大文件

Android 通过网络/本地主机发送大文件,android,inputstream,large-files,outputstream,Android,Inputstream,Large Files,Outputstream,代码如下: private void sendFile(InputStream file, OutputStream out) throws IOException { Log.d(TAG, "trying to send file..."); final int buffer_size = 4096; try { byte[] bytes = new byte[buffer_size]; while

代码如下:

private void sendFile(InputStream file, OutputStream out) throws IOException {
        Log.d(TAG, "trying to send file...");
        final int buffer_size = 4096;
        try {
            byte[] bytes = new byte[buffer_size];
            while(true) {
                int count = file.read(bytes, 0, buffer_size);
                if (count == -1) {                  
                    break;
                }
                out.write(bytes, 0, count);
                Log.d("copystream", bytes + "");
            }
        } catch (Exception e) {
            Log.e("copystream", "exception caught while sending file... " + e.getMessage());
        }
    }
我试图通过输出流(OutputStream out)发送一个大文件(InputStream文件)。这段代码适用于较小的文件,但对于5mb及以上的文件(我还没有测试过这个限制),它只是在一段时间后冻结,没有任何错误或任何东西

Log.d(“复制流”,字节+”)将输出一段时间,但最终将停止日志记录

Log.e(“copystream”,“发送文件时捕获异常…”+e.getMessage())从不显示

这是一个更大的代码库的一部分,它实际上是一个运行在Android设备上的文件服务器


有什么想法吗?

使用多部分帖子。差不多

MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, null,null); 
entity.addPart("File", new FileBody (new File(FILE_PATH), MIME_TYPE));
httppost.setEntity(entity); 
HttpResponse response = httpclient.execute(httppost); 
return response;

使用多部分POST。差不多

MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, null,null); 
entity.addPart("File", new FileBody (new File(FILE_PATH), MIME_TYPE));
httppost.setEntity(entity); 
HttpResponse response = httpclient.execute(httppost); 
return response;

为此使用AsyncTask类,下面是链接示例

为此使用AsyncTask类,下面是链接示例

以下是它成功的原因:

while (true) {
  synchronized (buffer) {
    int amountRead = file.read(buffer);
    if (amountRead == -1) {
      break;
    }
    out.write(buffer, 0, amountRead);
  }
}

以下是成功的原因:

while (true) {
  synchronized (buffer) {
    int amountRead = file.read(buffer);
    if (amountRead == -1) {
      break;
    }
    out.write(buffer, 0, amountRead);
  }
}

我很确定问题出在服务器端。另外,我正试图在视频播放器中直接使用该文件(我正试图发送一个3gp文件)。我见过其他android web/文件服务器,其中一些确实存在这个问题。其中一个不是kWS,但遗憾的是我找不到它的源代码。对不起,我不是一个服务器的家伙,所以不能在这方面帮助你。我很确定问题是服务器端的。另外,我正试图在视频播放器中直接使用该文件(我正试图发送一个3gp文件)。我见过其他android web/文件服务器,其中一些确实存在这个问题。其中一个没有kWS,尽管很遗憾我找不到它的源代码。很抱歉,我不是一个服务器人员,所以不能在这方面帮助您。您可以在AsyncTask的doInBackground方法中编写while循环,以便操作系统为其分配单独的线程。我想这会解决你的问题。不。这将产生大量的AsyncTask(这个循环速度非常快),这弊大于利。您可以在AsyncTask的doInBackground方法中编写while循环,以便操作系统为其分配单独的线程。我想这会解决你的问题。不。这会让我产生大量的异步任务(这个循环进行得非常快),这弊大于利。