应项目需要,弄了个多文件上传,分享给大家,求指正,共进步

package com.zhougan.upload.util;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.UUID;

/**
 * Created by 1 on 2016/3/19.
 */
public class UploadUtil {
    private static final String PREFIX = "--"; //前缀
    private static final String BOUNDARY = UUID.randomUUID().toString();//随机生成数据分割符
    private static final String End_LINE = "\r\n";//换行

    private URL url=null;
    private int connTimeOut = 5 * 1000;//连接超时
    private int readTimeOut = 5 * 1000;//读取超时
    private List<Content> lists;//存放要发送的内容


    private HttpURLConnection conn;

    private CallbackResponse callbackResponse;//处理响应的回调接口


    public UploadUtil() {

    }

    //向服务器发送数据
    public void sendData(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                setHttpHeader();//设置请求头
                DataOutputStream dos = null;
                FileInputStream fis=null;//读取要发送的文件
                try {
                     dos=new DataOutputStream(conn.getOutputStream());//用数据流包装输出流

                    for(Content content : lists){//遍历要发送的数据
                        //发送内容信息
                        dos.write(content.getContentHeader().getBytes(content.charset));

                        //发送文件
                        if(content.isFile){
                            File file = content.getFile();
                            fis=new FileInputStream(file);
                            byte[] buf=new byte[1024*10];//10k缓存
                            int len=0;
                            while((len=fis.read(buf))!=-1){
                                dos.write(buf,0,len);
                            }
                            dos.flush();
                            dos.write(End_LINE.getBytes());//发送完毕换行
                            if(fis!=null){
                                fis.close();fis=null;
                            }
                        }else{//发送字符串
                            dos.write(content.getStringData());
                        }
                    }
                    //发送结束标志
                    dos.write((PREFIX+BOUNDARY+PREFIX+End_LINE).getBytes());
                    dos.flush();
                    if(dos!=null){
                        dos.close();dos=null;
                    }

                    //处理响应
                    if(conn.getResponseCode()==200){
//                        System.out.println("200");
                        if(callbackResponse!=null){
                            callbackResponse.response(conn);
                        }
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                }finally{
                    try {//关闭所有流和连接
                        if(fis!=null){
                            fis.close();
                        }
                        if(dos!=null){
                             dos.close();
                        }
                        if(conn!=null){
                            conn.disconnect();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }



            }
        }).start();

    }

    //设置请求头
    private void setHttpHeader(){
        try {
            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");//post方式发送
            conn.setConnectTimeout(connTimeOut);//设置连接超时
            conn.setReadTimeout(readTimeOut);//设置读取超时
            conn.setUseCaches(false);//禁用缓存
            conn.setDoOutput(true);//允许输出
            conn.setDoInput(true);//允许输入
            //以表单的形式发送
            conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + BOUNDARY);
            conn.setRequestProperty("Connection", "Keep-Alive");//保持长连接
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //添加要发送的数据
    public void setData(List<Content> lists){
        this.lists=lists;
    }

    public void setUrl(URL url) {
        this.url = url;
    }

    public int getConnTimeOut() {
        return connTimeOut;
    }

    public void setConnTimeOut(int connTimeOut) {
        this.connTimeOut = connTimeOut;
    }

    public int getReadTimeOut() {
        return readTimeOut;
    }

    public void setReadTimeOut(int readTimeOut) {
        this.readTimeOut = readTimeOut;
    }

    public void setCallbackResponse(CallbackResponse callbackResponse) {
        this.callbackResponse = callbackResponse;
    }

    //定义发送的数据 一个Content表示一条数据
    public static class Content{
        private String type="text/plain";//默认文本类型
        private String charset="utf-8";//默认utf-8编码
        private long contentLength=0;//文件内容长度
        private String name="name";//服务器获得数据的key
        private String value="value";//字符串数据内容
        private File file;//文件
        private String filename="filename";//文件名字
        private boolean isFile=false;//本条数据是否是文件

        //无参构造器,使用默认的类型和编码
        public Content(){

        }
        //编码,类型
        public Content(String charset, String type) {
            if(charset!=null)
                this.charset = charset;
            if(type!=null)
                this.type = type;
        }

        //设置要发送的字符串数据
        public void setData(String name,String value){
            isFile=false;
            if(name!=null)
                this.name=name;
            if(value!=null)
                this.value=value;
        }

        //设置要发送的文件
        public void setData(String name,File file){
            isFile=true;
            if(name!=null)
                this.name=name;
            if(file!=null){
                this.file=file;
                this.filename=file.getName();
                contentLength=file.length();
            }

        }

        //获得字符串数据
        private byte[] getStringData(){
            StringBuffer sb=new StringBuffer();

            sb.append(value);
            sb.append(End_LINE);//发送完了换行

            try {
                return sb.toString().getBytes(charset);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return null;
        }

        //构建内容头
        private String getContentHeader(){
            StringBuffer sb=new StringBuffer();

            sb.append(PREFIX + BOUNDARY + End_LINE);//分割数据
            //设置本条数据的信息
            if(isFile){//文件
                sb.append("Content-Disposition: form-data; name=\""+name+"\""+"; filename=\""+filename+"\""+End_LINE);
                if(contentLength>0){
                    sb.append("Content-Length: "+String.valueOf(contentLength)+End_LINE);
                }

            }else{//非文件
                sb.append("Content-Disposition: form-data; name=\""+name+"\""+End_LINE);
            }
            //类型 和编码
            sb.append("Content-Type: "+type +"; charset="+charset + End_LINE);

            sb.append(End_LINE);//数据信息和数据内容之间空一行
            return sb.toString();
        }

        //获取文件
        private File getFile(){
            return file;
        }

    }

    //处理响应的回调接口(可以不用,如果不需要处理响应)
    public interface CallbackResponse{
        void response(HttpURLConnection conn);
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适各平台技术的最新发展和市场需。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
好,我会尽力回答您的问题。 首先,简单多用户文件系统模拟需要至少包含以下程序文件: - main.c:主函数和程序的入口。 - filesystem.c:文件系统的具体实现。 - user.c:用户相关操作的实现。 - file.c:文件相关操作的实现。 下面是一个简单的Makefile文件,用于将这些源文件编译成可执行文件: ```makefile CC = gcc CFLAGS = -Wall -g all: filesystem filesystem: main.o filesystem.o user.o file.o $(CC) $(CFLAGS) -o $@ $^ main.o: main.c filesystem.h user.h file.h $(CC) $(CFLAGS) -c $< filesystem.o: filesystem.c filesystem.h $(CC) $(CFLAGS) -c $< user.o: user.c user.h filesystem.h $(CC) $(CFLAGS) -c $< file.o: file.c file.h filesystem.h $(CC) $(CFLAGS) -c $< clean: rm -f *.o filesystem ``` 上述Makefile文件中,我们使用了变量`CC`和`CFLAGS`,分别代表编译器和编译选项。我们使用了`all`作为默认目标,将`filesystem`作为最终目标。`filesystem`依赖于`main.o`、`filesystem.o`、`user.o`和`file.o`,在编译时,我们使用`$^`代表所有依赖文件,`$@`代表目标文件名。接下来是各个目标的具体规则: - `main.o`:依赖于`main.c`、`filesystem.h`、`user.h`和`file.h`,使用`-c`选项将源文件编译为目标文件。 - `filesystem.o`:依赖于`filesystem.c`和`filesystem.h`,使用`-c`选项将源文件编译为目标文件。 - `user.o`:依赖于`user.c`、`user.h`和`filesystem.h`,使用`-c`选项将源文件编译为目标文件。 - `file.o`:依赖于`file.c`、`file.h`和`filesystem.h`,使用`-c`选项将源文件编译为目标文件。 最后,我们使用`clean`目标来清除所有的目标文件和可执行文件。 使用Makefile编译程序时,只需要在终端中输入`make`即可。如果需要清除所有目标文件和可执行文件,可以输入`make clean`。 希望这个回答能够帮助您解决问题,如有不足之处,还请指正

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值