断点继传

import

 java.io.File;


import

 java.net.URL;


import

 java.net.URLConnection;


import

 android.app.Activity;


import

 android.os.Bundle;


import

 android.os.Environment;


import

 android.os.Handler;


import

 android.os.Message;


import

 android.view.View;


import

 android.view.View.OnClickListener;


import

 android.widget.Button;


import

 android.widget.EditText;


import

 android.widget.ProgressBar;


import

 android.widget.TextView;


/**


 *  Copyright (C) 2010 ideasandroid
 *  演示android多线程下载
 *  欢迎访问http://www.ideasandroid.com
 *  让程序开发不再那么神秘
 

*/




public

 

class

 FileDownloadDemo 

extends

 Activity {
 
    

private

 EditText downloadUrl;
    

private

 EditText downloadFileName;
    

private

 EditText downloadThreadNum;
    

private

 Button downloadBt;
    

private

 ProgressBar downloadProgressBar;
    

private

 TextView progressMessage;
    

private

 

int

 downloadedSize 

=

 

0

;
    

private

 

int

 fileSize 

=

 

0

;
 
    @Override
    

public

 

void

 onCreate(Bundle savedInstanceState) {
        

super

.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        downloadUrl 

=

 (EditText) findViewById(R.id.downloadUrl);
        downloadFileName 

=

 (EditText) findViewById(R.id.downloadFileName);
        downloadThreadNum 

=

 (EditText) findViewById(R.id.downloadThreadNum);
        progressMessage 

=

 (TextView) findViewById(R.id.progressMessage);
        downloadBt 

=

 (Button) findViewById(R.id.downloadBt);
        downloadProgressBar 

=

 (ProgressBar) findViewById(R.id.downloadProgressBar);
        downloadProgressBar.setVisibility(View.VISIBLE);
        downloadProgressBar.setMax(

100

);
        downloadProgressBar.setProgress(

0

);
        downloadBt.setOnClickListener(

new

 OnClickListener() {
            

public

 

void

 onClick(View v) {
                download();
            }
        });
    }
 
    

private

 

void

 download() {
        

//

 获取SD卡目录




        String dowloadDir 

=

 Environment.getExternalStorageDirectory()
                

+

 

"

/ideasdownload/

"

;
        File file 

=

 

new

 File(dowloadDir);
        

//

创建下载目录




        

if

 (

!

file.exists()) {
            file.mkdirs();
        }
 
        

//

读取下载线程数,如果为空,则单线程下载




        

int

 downloadTN 

=

 Integer.valueOf(

""

.equals(downloadThreadNum.getText()
                .toString()) 

?

 

"

1

"

 : downloadThreadNum.getText().toString());
        

//

如果下载文件名为空则获取Url尾为文件名




        

int

 fileNameStart 

=

 downloadUrl.getText().toString().lastIndexOf(

"

/

"

);
        String fileName 

=

 

""

.equals(downloadFileName.getText().toString()) 

?

 downloadUrl
                .getText().toString().substring(fileNameStart)
                : downloadFileName.getText().toString();
        

//

开始下载前把下载按钮设置为不可用




        downloadBt.setClickable(

false

);
        

//

进度条设为0




        downloadProgressBar.setProgress(

0

);
        

//

启动文件下载线程




        

new

 downloadTask(downloadUrl.getText().toString(), Integer
                .valueOf(downloadTN), dowloadDir 

+

 fileName).start();
    }
 
    Handler handler 

=

 

new

 Handler() {
        @Override
        

public

 

void

 handleMessage(Message msg) {
            

//

当收到更新视图消息时,计算已完成下载百分比,同时更新进度条信息




            

int

 progress 

=

 (Double.valueOf((downloadedSize 

*

 

1.0

 

/

 fileSize 

*

 

100

))).intValue();
            

if

 (progress 

==

 

100

) {
                downloadBt.setClickable(

true

);
                progressMessage.setText(

"

下载完成!

"

);
            } 

else

 {
                progressMessage.setText(

"

当前进度:

"

 

+

 progress 

+

 

"

%

"

);
            }
            downloadProgressBar.setProgress(progress);
        }
 
    };
 
    

/**


     * 

@author

 ideasandroid
     * 主下载线程
     

*/


    

public

 

class

 downloadTask 

extends

 Thread {
        

private

 

int

 blockSize, downloadSizeMore;
        

private

 

int

 threadNum 

=

 

5

;
        String urlStr, threadNo, fileName;
 
        

public

 downloadTask(String urlStr, 

int

 threadNum, String fileName) {
            

this

.urlStr 

=

 urlStr;
            

this

.threadNum 

=

 threadNum;
            

this

.fileName 

=

 fileName;
        }
 
        @Override
        

public

 

void

 run() {
            FileDownloadThread[] fds 

=

 

new

 FileDownloadThread[threadNum];
            

try

 {
                URL url 

=

 

new

 URL(urlStr);
                URLConnection conn 

=

 url.openConnection();
                

//

获取下载文件的总大小




                fileSize 

=

 conn.getContentLength();
                

//

计算每个线程要下载的数据量




                blockSize 

=

 fileSize 

/

 threadNum;
                

//

 解决整除后百分比计算误差




                downloadSizeMore 

=

 (fileSize 

%

 threadNum);
                File file 

=

 

new

 File(fileName);
                

for

 (

int

 i 

=

 

0

; i 

<

 threadNum; i

++

) {
                    

//

启动线程,分别下载自己需要下载的部分




                    FileDownloadThread fdt 

=

 

new

 FileDownloadThread(url, file,
                            i 

*

 blockSize, (i 

+

 

1

) 

*

 blockSize 

-

 

1

);
                    fdt.setName(

"

Thread

"

 

+

 i);
                    fdt.start();
                    fds[i] 

=

 fdt;
                }
                

boolean

 finished 

=

 

false

;
                

while

 (

!

finished) {
                    

//

 先把整除的余数搞定




                    downloadedSize 

=

 downloadSizeMore;
                    finished 

=

 

true

;
                    

for

 (

int

 i 

=

 

0

; i 

<

 fds.length; i

++

) {
                        downloadedSize 

+=

 fds[i].getDownloadSize();
                        

if

 (

!

fds[i].isFinished()) {
                            finished 

=

 

false

;
                        }
                    }
                    

//

通知handler去更新视图组件




                    handler.sendEmptyMessage(

0

);
                    

//

休息1秒后再读取下载进度




                    sleep(

1000

);
                }
            } 

catch

 (Exception e) {
 
            }
 
        }
    }
}


import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.net.URL; import java.net.URLConnection; import android.util.Log; /** * Copyright (C) 2010 ideasandroid * 演示android多线程下载 * 欢迎访问http://www.ideasandroid.com * 让程序开发不再那么神秘 * * 单个下载线程 */ public class FileDownloadThread extends Thread{ private static final int BUFFER_SIZE = 1024 ; private URL url; private File file; private int startPosition; private int endPosition; private int curPosition; // 用于标识当前线程是否下载完成 private boolean finished = false ; private int downloadSize = 0 ; public FileDownloadThread(URL url,File file, int startPosition, int endPosition){ this .url = url; this .file = file; this .startPosition = startPosition; this .curPosition = startPosition; this .endPosition = endPosition; } @Override public void run() { BufferedInputStream bis = null ; RandomAccessFile fos = null ; byte [] buf = new byte [BUFFER_SIZE]; URLConnection con = null ; try { con = url.openConnection(); con.setAllowUserInteraction( true ); // 设置当前线程下载的起点,终点 con.setRequestProperty( " Range " , " bytes= " + startPosition + " - " + endPosition); // 使用java中的RandomAccessFile 对文件进行随机读写操作 fos = new RandomAccessFile(file, " rw " ); // 设置开始写文件的位置 fos.seek(startPosition); bis = new BufferedInputStream(con.getInputStream()); // 开始循环以流的形式读写文件 while (curPosition < endPosition) { int len = bis.read(buf, 0 , BUFFER_SIZE); if (len == - 1 ) { break ; } fos.write(buf, 0 , len); curPosition = curPosition + len; if (curPosition > endPosition) { downloadSize += len - (curPosition - endPosition) + 1 ; } else { downloadSize += len; } } // 下载完成设为true this .finished = true ; bis.close(); fos.close(); } catch (IOException e) { Log.d(getName() + " Error: " , e.getMessage()); } } public boolean isFinished(){ return finished; } public int getDownloadSize() { return downloadSize; } }

转自http://www.goprogram.org/blog/?p=66
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 智慧社区背景与挑战 随着城市化的快速发展,社区面临健康、安全、邻里关系和服务质量等多方面的挑战。华为技术有限公司提出智慧社区解决方案,旨在通过先进的数字化技术应对这些问题,提升城市社区的生活质量。 2. 技术推动智慧社区发展 技术进步,特别是数字化、无线化、移动化和物联化,为城市社区的智慧化提供了可能。这些技术的应用不仅提高了社区的运行效率,也增强了居民的便利性和安全性。 3. 智慧社区的核心价值 智慧社区承载了智慧城市的核心价值,通过全面信息化处理,实现对城市各个方面的数字网络化管理、服务与决策功能,从而提升社会服务效率,整合社会服务资源。 4. 多层次、全方位的智慧社区服务 智慧社区通过构建和谐、温情、平安和健康四大社区模块,满足社区居民的多层次需求。这些服务模块包括社区医疗、安全监控、情感沟通和健康监测等。 5. 智慧社区技术框架 智慧社区技术框架强调统一平台的建设,设立数据中心,构建基础网络,并通过分层建设,实现平台能力及应用的可持续成长和扩展。 6. 感知统一平台与服务方案 感知统一平台是智慧社区的关键组成部分,通过统一的RFID身份识别和信息管理,实现社区服务的智能化和便捷化。同时,提供社区内外监控、紧急救助服务和便民服务等。 7. 健康社区的构建 健康社区模块专注于为居民提供健康管理服务,通过整合医疗资源和居民接入,实现远程医疗、慢性病管理和紧急救助等功能,推动医疗模式从治疗向预防转变。 8. 平安社区的安全保障 平安社区通过闭路电视监控、防盗报警和紧急求助等技术,保障社区居民的人身和财产安全,实现社区环境的实时监控和智能分析。 9. 温情社区的情感沟通 温情社区着重于建立社区居民间的情感联系,通过组织社区活动、一键呼叫服务和互帮互助平台,增强邻里间的交流和互助。 10. 和谐社区的资源整合 和谐社区作为社会资源的整合协调者,通过统一接入和身份识别,实现社区信息和服务的便捷获取,提升居民生活质量,促进社区和谐。
Flask是一个基于Python的轻量级Web应用框架,它提供了一种简单而灵活的方式来构建Web应用程序。断点续传是指在文件上传或下载过程中,如果中断了连接或者出现其他异常情况,可以从中断的位置继续传输而不需要重新开始。 在Flask中实现断点续传可以通过以下步骤: 1. 在Flask应用中配置文件上传的最大大小,可以使用`app.config['MAX_CONTENT_LENGTH']`来设置最大文件大小。 2. 在前端页面中使用HTML的`<input type="file">`标签来实现文件上传功能。 3. 在后端的路由函数中,使用`request.files`获取上传的文件对象。 4. 判断是否存在已上传的部分文件,可以通过检查请求头中的`Range`字段来判断是否有断点续传的需求。 5. 如果有断点续传的需求,可以通过读取已上传的部分文件,然后在继续上传时将数据追加到已上传的文件中。 6. 如果没有断点续传的需求,直接保存上传的文件即可。 下面是一个简单的示例代码: ```python from flask import Flask, request app = Flask(__name__) @app.route('/upload', methods=['POST']) def upload(): file = request.files['file'] if 'Range' in request.headers: # 断点续传逻辑 range_header = request.headers['Range'] # 解析Range字段,获取已上传的文件大小 # 根据已上传的文件大小,将数据追加到已上传的文件中 else: # 直接保存上传的文件 file.save('path/to/save/file') return 'Upload success' if __name__ == '__main__': app.run() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值