文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

android文件上传示例分享(android图片上传)

2022-06-06 10:25

关注


主要思路是调用系统文件管理器或者其他媒体采集资源来获取要上传的文件,然后将文件的上传进度实时展示到进度条中。

主Activity

代码如下:
package com.guotop.elearn.activity.app.yunpan.activity;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.MediaStore.Audio.Media;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;

import com.guotop.base.activity.BaseActivity;
import com.guotop.base.util.MyFile;
import com.guotop.elearn.activity.R;
import com.guotop.elearn.activity.app.yunpan.item.YunPanUploadFileItem;


public class YunPanUploadFileActivity extends BaseActivity implements OnClickListener{

    String userId, parentId;
    private final static int FILECHOOSER_RESULTCODE = 0;
//    private String openFileType="";
    private String mVideoFilePath,mPhotoFilePath,mVoiceFilePath;
    private Button chooseBtn,uploadBtn;
    private LinearLayout conterLayout;
    private String actionURL;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState, this);
        setTitle("云盘上传文件");
        setContentView(R.layout.activity_yunpan_uploadfile);
        userId = getIntent().getStringExtra("userId");
        parentId = getIntent().getStringExtra("parentId");
        actionURL = getIntent().getStringExtra("actionURL");
        chooseBtn = (Button)findViewById(R.id.chooseBtn);
        uploadBtn = (Button)findViewById(R.id.uploadBtn);
        conterLayout = (LinearLayout)findViewById(R.id.conterLayout);
        chooseBtn.setOnClickListener(this);
        uploadBtn.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        if(v.getId()==R.id.chooseBtn){
//            //选择文件       
            startActivityForResult(createDefaultOpenableIntent(), YunPanUploadFileActivity.FILECHOOSER_RESULTCODE);
//            Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
//            startActivityForResult(intent, YunPanUploadFileActivity.FILECHOOSER_RESULTCODE);
           

//              Intent intent = new Intent(Media.RECORD_SOUND_ACTION);
//            ((Activity) context).startActivityForResult(intent, YunPanUploadFileActivity.FILECHOOSER_RESULTCODE);
        }else if(v.getId()==R.id.uploadBtn){
            //上传文件
        }
    }
   
   
    public void createUploadFileItem(String filePath){
//        View view = LayoutInflater.from(context).inflate(R.layout.activity_yunpan_uploadfile_item, null);
        new YunPanUploadFileItem(context, conterLayout, filePath,actionURL);

    }
   
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub
        super.onConfigurationChanged(newConfig);
    }
   
    private Intent createDefaultOpenableIntent() {
        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
        i.addCategory(Intent.CATEGORY_OPENABLE);
        i.putExtra(Intent.EXTRA_TITLE, "选择文件");
        i.setType("*
public class YunPanUploadFileItem implements OnClickListener {

    LinearLayout view,parentView;
    String filePath;

    private Context context;

    private TextView uploadFileProgressText, uploadFileName;
    private ProgressBar uploadFileProgressBar;
    private ImageView uploadFileImg;
    private Button startUploadFileBtn, cancelUploadFileBtn;
    private String actionURL;

    BaseHandler handler;
    UploadYunFileHttpThread t;
    UploadYunFileInformaction uploadYunFileInformaction ;

    public YunPanUploadFileItem(Context context,LinearLayout parentView, String filePath,String actionURL) {
        this.parentView = parentView;
        this.actionURL = actionURL;
        this.context = context;
        File file = new File(filePath);
        this.view = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.activity_yunpan_uploadfile_item, null);
//        this.view = view;
        this.filePath = filePath;

        uploadFileProgressText = (TextView) view.findViewById(R.id.uploadFileProgressText);
        uploadFileName = (TextView) view.findViewById(R.id.uploadFileName);

        uploadFileProgressBar = (ProgressBar) view.findViewById(R.id.uploadFileProgressBar);
        uploadFileImg = (ImageView) view.findViewById(R.id.uploadFileImg);

        cancelUploadFileBtn = (Button) view.findViewById(R.id.cancelUploadFileBtn);
        startUploadFileBtn = (Button) view.findViewById(R.id.startUploadFileBtn);
        uploadFileName.setText(file.getName()+"   大小"+MyFile.formetFileSize(file.getPath()));
        uploadFileImg.setImageResource(MyFile.getFileIcon(file));
   

        startUploadFileBtn.setOnClickListener(this);
        cancelUploadFileBtn.setOnClickListener(this);
        parentView.addView(view);
       

        uploadYunFileInformaction = new UploadYunFileInformaction(filePath);
        myHandler = new MyHandler(Looper.myLooper(), this);
        uploadYunFileInformaction.setNotificationId(new Random().nextInt(10000));
        uploadYunFileInformaction.setActionURL(actionURL);
        t = new UploadYunFileHttpThread(myHandler, uploadYunFileInformaction);
        uploads.put(uploadYunFileInformaction.getNotificationId(), t);

    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.startUploadFileBtn) {
            downFile(t);
            startUploadFileBtn.setClickable(false);
        }else if(v.getId()==R.id.cancelUploadFileBtn){
            if(t.isStart){
                new AlertDialog.Builder(context).setTitle("系统提示!").setMessage("该文件正在上传确定要强制停止?")
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                            }
                        }).setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                t.interrupt();
                                parentView.removeView(view);
                                uploads.removeKey(uploadYunFileInformaction.getNotificationId());
                                System.gc();
                            }
                        }).show();
            }else {

                parentView.removeView(view);
                uploads.removeKey(uploadYunFileInformaction.getNotificationId());
            }
        }
    }

    public static MyHashMap<Integer, UploadYunFileHttpThread> uploads = new MyHashMap<Integer, UploadYunFileHttpThread>();

    private MyHandler myHandler;

    public IBinder onBind(Intent intent) {
        return null;
    }

    // 下载更新文件
    private void downFile(UploadYunFileHttpThread t) {
        int len = 3;

        if (t != null && uploads.size() <= len) {
            if (!t.isStart) {
                t.start();
            }
        } else if (t == null && uploads.size() >= len) {
            t = uploads.get(len - 1);
            if (!t.isStart) {
                t.start();
            }
        }
    }

   
    class MyHandler extends BaseHandler {
        private WeakReference<YunPanUploadFileItem> bdfs;

        public MyHandler(Looper looper, YunPanUploadFileItem yunPanUploadFileItem) {
            super(looper);
            this.bdfs = new WeakReference<YunPanUploadFileItem>(yunPanUploadFileItem);
        }

        @Override
        public void handleMessage(Message msg) {
            YunPanUploadFileItem bdfs = this.bdfs.get();
            if (bdfs == null) {
                return;
            }
            if (msg != null) {
                switch (msg.what) {
                case 0:
                    Toast.makeText(L.livingActivity, msg.obj.toString(), Toast.LENGTH_SHORT).show();
                    break;
                case L.dowloadStart:
                    break;
                case L.dowloadFinish:
                    // 下载完成后清除所有下载信息,执行安装提示
                    try {
                        uploads.removeKey(msg.getData().getInt("notificationId"));
                        bdfs.uploadFileProgressText.setText("上传完成");
                        bdfs.uploadFileProgressBar.setMax(100);
                        bdfs.uploadFileProgressBar.setProgress(100);
                        startUploadFileBtn.setClickable(false);
                    } catch (Exception e) {

                    }
                    bdfs.downFile(null);
                    break;
                case L.dowloadPercentage:
                    // 更新状态栏上的下载进度信息
                    bdfs.uploadFileProgressText.setText("总共:"+MyFile.formetFileSize(msg.getData().getInt("fileSize"))+ "/" + MyFile.formetFileSize(msg.getData().getInt("finishFileSize")) + "  已上传"
                            + msg.getData().getInt("percentage") + "%");
                    bdfs.uploadFileProgressBar.setMax(100);
                    bdfs.uploadFileProgressBar.setProgress(msg.getData().getInt("percentage"));
                    break;
                case 4:
                    // bdfs.nm.cancel(msg.getData().getInt("notificationId"));
                    break;
                }

            }
        }
    }

}

用来上传文件的线程

代码如下:
package com.guotop.elearn.activity.app.yunpan.thread;

import java.net.SocketException;

import com.guotop.base.L;
import com.guotop.base.Util;
import com.guotop.base.handler.BaseHandler;
import com.guotop.base.thread.HttpThread;
import com.guotop.elearn.activity.app.yunpan.bean.UploadYunFileInformaction;
import com.guotop.elearn.activity.app.yunpan.util.YunPanUploadFile;
import com.guotop.elearn.activity.app.yunpan.util.YunPanUploadFileHttpInterface;


public class UploadYunFileHttpThread extends HttpThread{
    @SuppressWarnings("unused")
    private UploadYunFileInformaction uploadYunFileInformaction;
    public boolean isStart=false;
    public static int RECONNECT = 1000002;
    public static int CAN_NOT_RECONNECT = 1000003;
    YunPanUploadFile yunPanUploadFile;
   
    public UploadYunFileHttpThread(){
    }
    public UploadYunFileHttpThread(BaseHandler handler,UploadYunFileInformaction dowFile){
        this.uploadYunFileInformaction=dowFile;
        this.handler=handler;
    }
    int fileSize,finishFileSize,percentage;

    private boolean isUpdate = true;
    public void run() {
        isStart=true;//是启动了
        new HttpThread(handler){
            public void run() {
                while (isUpdate) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                    }
                    if(finishFileSize!=0&&fileSize!=0){
                        msg = handler.obtainMessage();
                        if(percentage>=100){
//                            msg.what=L.dowloadFinish;
//                            msg.setData(bundle);
//                            handler.sendMessage(msg);
                            break;
                        }else {
                            bundle.putString("fileName", uploadYunFileInformaction.getFileName());
                            bundle.putInt("percentage", percentage);
                            bundle.putInt("finishFileSize", finishFileSize);
                            bundle.putInt("fileSize", fileSize);
                            msg.what=L.dowloadPercentage;
                            msg.setData(bundle);
                            handler.sendMessage(msg);
                            sendMessage(1000000);// 为了取消等待框
      &nb sp;                 }
                    }
                }
            }
        }.start();

        try {
            uploadFile();
        } catch (Exception e) {
            isUpdate = false;
            isStart = false;
        }
    }
    private void uploadFile() {
        yunPanUploadFile = new YunPanUploadFile(dbfInterface, uploadYunFileInformaction, L.COOKIE);
        result = yunPanUploadFile.post();
        msg = handler.obtainMessage();
        bundle.putInt("notificationId", uploadYunFileInformaction.getNotificationId());
        bundle.putString("path", uploadYunFileInformaction.getPath());
        bundle.putString("result", result);
        msg.what = L.dowloadFinish;
        msg.setData(bundle);
        handler.sendMessage(msg);
        isUpdate = false;
        isStart = false;
    }
   
    YunPanUploadFileHttpInterface dbfInterface = new YunPanUploadFileHttpInterface() {
        //初始化下载后
        public void initFileSize(int size) {
            fileSize=size;
            msg = handler.obtainMessage();
            bundle.putInt("fileSize", fileSize);
            msg.what = L.dowloadStart;
            msg.setData(bundle);
            handler.sendMessage(msg);
        }
        //现在计划进行中
        public void uploadPlan(int fileSize,int finishSize) {
            finishFileSize=finishSize;
            percentage=finishSize/(fileSize/100);
            if(percentage<-1L){
                Util.LogGL(this.getClass().getName(), "downloadPlan",percentage+"");
            }
        }
        //下载完成
        public void uploadFinish(String file) {
            percentage=101;
        }
    };
    public UploadYunFileInformaction getDowloadFileInformaction() {
        return uploadYunFileInformaction;
    }
    public void setDowloadFileInformaction(
            UploadYunFileInformaction dowloadFileInformaction) {
        this.uploadYunFileInformaction = dowloadFileInformaction;
    }
    @Override
    public void interrupt() {
        yunPanUploadFile.close();
        super.interrupt();
    }
}

记录文件信息Bean

代码如下:
package com.guotop.elearn.activity.app.yunpan.item;

import java.io.File;
import java.lang.ref.WeakReference;
import java.util.Random;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.guotop.base.L;
import com.guotop.base.handler.BaseHandler;
import com.guotop.base.thread.HttpThread;
import com.guotop.base.util.MyFile;
import com.guotop.base.util.MyHashMap;
import com.guotop.elearn.activity.R;
import com.guotop.elearn.activity.app.yunpan.Y;
import com.guotop.elearn.activity.app.yunpan.bean.UploadYunFileInformaction;
import com.guotop.elearn.activity.app.yunpan.thread.UploadYunFileHttpThread;


public class YunPanUploadFileItem implements OnClickListener {

    LinearLayout view,parentView;
    String filePath;

    private Context context;

    private TextView uploadFileProgressText, uploadFileName;
    private ProgressBar uploadFileProgressBar;
    private ImageView uploadFileImg;
    private Button startUploadFileBtn, cancelUploadFileBtn;
    private String actionURL;

    BaseHandler handler;
    UploadYunFileHttpThread t;
    UploadYunFileInformaction uploadYunFileInformaction ;

    public YunPanUploadFileItem(Context context,LinearLayout parentView, String filePath,String actionURL) {
        this.parentView = parentView;
        this.actionURL = actionURL;
        this.context = context;
        File file = new File(filePath);
        this.view = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.activity_yunpan_uploadfile_item, null);
//        this.view = view;
        this.filePath = filePath;

        uploadFileProgressText = (TextView) view.findViewById(R.id.uploadFileProgressText);
        uploadFileName = (TextView) view.findViewById(R.id.uploadFileName);

        uploadFileProgressBar = (ProgressBar) view.findViewById(R.id.uploadFileProgressBar);
        uploadFileImg = (ImageView) view.findViewById(R.id.uploadFileImg);

        cancelUploadFileBtn = (Button) view.findViewById(R.id.cancelUploadFileBtn);
        startUploadFileBtn = (Button) view.findViewById(R.id.startUploadFileBtn);
        uploadFileName.setText(file.getName()+"   大小"+MyFile.formetFileSize(file.getPath()));
        uploadFileImg.setImageResource(MyFile.getFileIcon(file));
   

        startUploadFileBtn.setOnClickListener(this);
        cancelUploadFileBtn.setOnClickListener(this);
        parentView.addView(view);
       

        uploadYunFileInformaction = new UploadYunFileInformaction(filePath);
        myHandler = new MyHandler(Looper.myLooper(), this);
        uploadYunFileInformaction.setNotificationId(new Random().nextInt(10000));
        uploadYunFileInformaction.setActionURL(actionURL);
        t = new UploadYunFileHttpThread(myHandler, uploadYunFileInformaction);
        uploads.put(uploadYunFileInformaction.getNotificationId(), t);

    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.startUploadFileBtn) {
            downFile(t);
            startUploadFileBtn.setClickable(false);
        }else if(v.getId()==R.id.cancelUploadFileBtn){
            if(t.isStart){
                new AlertDialog.Builder(context).setTitle("系统提示!").setMessage("该文件正在上传确定要强制停止?")
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                            }
                        }).setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                t.interrupt();
                                parentView.removeView(view);
                                uploads.removeKey(uploadYunFileInformaction.getNotificationId());
                                System.gc();
                            }
                        }).show();
            }else {

                parentView.removeView(view);
                uploads.removeKey(uploadYunFileInformaction.getNotificationId());
            }
        }
    }

    public static MyHashMap<Integer, UploadYunFileHttpThread> uploads = new MyHashMap<Integer, UploadYunFileHttpThread>();

    private MyHandler myHandler;

    public IBinder onBind(Intent intent) {
        return null;
    }

    // 下载更新文件
    private void downFile(UploadYunFileHttpThread t) {
        int len = 3;

        if (t != null && uploads.size() <= len) {
            if (!t.isStart) {
                t.start();
            }
        } else if (t == null && uploads.size() >= len) {
            t = uploads.get(len - 1);
            if (!t.isStart) {
                t.start();
            }
        }
    }

   
    class MyHandler extends BaseHandler {
        private WeakReference<YunPanUploadFileItem> bdfs;

        public MyHandler(Looper looper, YunPanUploadFileItem yunPanUploadFileItem) {
            super(looper);
            this.bdfs = new WeakReference<YunPanUploadFileItem>(yunPanUploadFileItem);
        }

        @Override
        public void handleMessage(Message msg) {
            YunPanUploadFileItem bdfs = this.bdfs.get();
            if (bdfs == null) {
                return;
            }
            if (msg != null) {
                switch (msg.what) {
                case 0:
                    Toast.makeText(L.livingActivity, msg.obj.toString(), Toast.LENGTH_SHORT).show();
                    break;
                case L.dowloadStart:
                    break;
                case L.dowloadFinish:
                    // 下载完成后清除所有下载信息,执行安装提示
                    try {
                        uploads.removeKey(msg.getData().getInt("notificationId"));
                        bdfs.uploadFileProgressText.setText("上传完成");
                        bdfs.uploadFileProgressBar.setMax(100);
                        bdfs.uploadFileProgressBar.setProgress(100);
                        startUploadFileBtn.setClickable(false);
                    } catch (Exception e) {

                    }
                    bdfs.downFile(null);
                    break;
                case L.dowloadPercentage:
                    // 更新状态栏上的下载进度信息
                    bdfs.uploadFileProgressText.setText("总共:"+MyFile.formetFileSize(msg.getData().getInt("fileSize"))+ "/" + MyFile.formetFileSize(msg.getData().getInt("finishFileSize")) + "  已上传"
                            + msg.getData().getInt("percentage") + "%");
                    bdfs.uploadFileProgressBar.setMax(100);
                    bdfs.uploadFileProgressBar.setProgress(msg.getData().getInt("percentage"));
                    break;
                case 4:
                    // bdfs.nm.cancel(msg.getData().getInt("notificationId"));
                    break;
                }

            }
        }
    }

}

文件上传工具类

代码如下:
package com.guotop.elearn.activity.app.yunpan.util;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import java.util.Map.Entry;

import android.R.integer;

import com.guotop.elearn.activity.app.yunpan.bean.UploadYunFileInformaction;


public class YunPanUploadFile {
    String multipart_form_data = "multipart/form-data";
    String twoHyphens = "--";
    String boundary = "****************SoMeTeXtWeWiLlNeVeRsEe"; // 数据分隔符
    String lineEnd = "\r\n";
    YunPanUploadFileHttpInterface  yunPanUploadFileHttpInterface;
    UploadYunFileInformaction uploadYunFileInformaction;
    String cookie;

   
    public YunPanUploadFile(YunPanUploadFileHttpInterface yunPanUploadFileHttpInterface,UploadYunFileInformaction uploadYunFileInformaction,String cookie){
        this.yunPanUploadFileHttpInterface = yunPanUploadFileHttpInterface;
        this.uploadYunFileInformaction = uploadYunFileInformaction;
        this.cookie = cookie;
    }
   

    public void write(UploadYunFileInformaction file, DataOutputStream output) {
        FileInputStream in;
        try {
            if (file.getPath() != null && !"".equals(file.getPath())) {
                in = new FileInputStream(new File(file.getPath()));
                int fileSize= in.available();
                int readySize = 0;
                yunPanUploadFileHttpInterface.initFileSize(fileSize);
                byte[] b = new byte[1024];
                while (in.read(b) > 0) {
                    readySize+=b.length;
                    yunPanUploadFileHttpInterface.uploadPlan(fileSize, readySize);
                    output.write(b, 0, b.length);
                }
            }
            output.writeBytes(lineEnd);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

   
    private void addFormField(Map<String, String> params, DataOutputStream output) {
        if (params != null) {
            for (Entry<String, String> param : params.entrySet()) {
                StringBuilder sb = new StringBuilder();
                sb.append(twoHyphens + boundary + lineEnd);
                sb.append("Content-Disposition: form-data; name=\"" + param.getKey() + "\"" + lineEnd);
                sb.append(lineEnd);
                sb.append(param.getValue() + lineEnd);
                try {
                    output.write(sb.toString().getBytes("utf-8"));// 发送表单字段数据
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

   
    public String post(){
        return post(null,uploadYunFileInformaction, cookie);
    }
    public String post(UploadYunFileInformaction uploadYunFileInformaction, String cookie,YunPanUploadFileHttpInterface yunPanUploadFileHttpInterface) {
        return post(null,uploadYunFileInformaction, cookie);
    }
    HttpURLConnection conn = null;
    DataOutputStream output = null;
    BufferedReader input = null;
    public String post(Map<String, String> params, UploadYunFileInformaction uploadYunFileInformaction, String cookie) {
        try {
            URL url = new URL(uploadYunFileInformaction.getActionURL());
            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestProperty("Cookie", cookie);
            conn.setConnectTimeout(120000);
            conn.setDoInput(true); // 允许输入
            conn.setDoOutput(true); // 允许输出
            conn.setUseCaches(false); // 不使用Cache
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Charset", "utf-8");
            conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
            conn.setRequestProperty("Connection", "keep-alive");
            conn.setRequestProperty("Content-Type", multipart_form_data + "; boundary=" + boundary);
            conn.setChunkedStreamingMode(1024*1024);//设置上传文件的缓存大小
            conn.connect();
            output = new DataOutputStream(conn.getOutputStream());
            //发送头数据
            sendSplitHead(uploadYunFileInformaction,output);
            //发送文件内容
            write(uploadYunFileInformaction, output);
            //发送表单数据
       &nb


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯