精华内容
下载资源
问答
  • data-toggle与data-target是什么作用

    万次阅读 2017-02-23 11:38:20
    data-toggle指以什么事件触发,常用的如modal,popover,tooltips等,data-target指事件的目标,一起使用就是代表data-target所指的元素以data-toggle指定的形式显示 data-target 与data-toggle 还有data-spy ...

     

    Bootstrap为这些a之类元素都绑定上了事件,而终止了链接默认行为。

     

    • data-toggle:指以什么事件触发相当于告诉浏览器你是一个什么组件,常用的如modal(模态框),popover(弹出框),tooltips(提示框)等,
    • data-target:指事件的设置目标,相当于告诉浏览器你要操作那个元素
    • 一起使用就是代表data-target所指的元素以data-toggle指定的形式显示

    当设置data-toggle="link"data-target="class"之后,bootstrap.js会使用这些值覆盖超链接的默认属性


    以下为转载

    HTML5允许开发者自由为其标签添加属性,这种自定义属性一般用“data-”开头。

    我目前理解到在bootstrap中data-target,data-toggle等属性主要有两种作用:
    【1.】在CSS中作标签选择器用。
    如:

    [data-toggle="buttons"] > .btn input[type="radio"],
    [data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
    [data-toggle="buttons"] > .btn input[type="checkbox"],
    [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
      position: absolute;
      clip: rect(0, 0, 0, 0);
      pointer-events: none;
    }

    【2.】 用来传递替换文本(不知道是不是这么说),见下面的例子:

    input[type=checkbox].ace.ace-switch + .lbl[data-lbl]::before {
      content: attr(data-lbl);
    }

    转摘: https://segmentfault.com/q/1010000004043423

    展开全文
  • Android11 无Root 访问data目录实现、Android11访问data目录、Android11解除data目录限制、Android11 data空白解决、SAF文件访问框架

    正文开始

    关于Android11权限变化

    谷歌在Android11及以上系统中采用了文件沙盒存储模式,导致第三方应用无法像以前一样访问Android/data目录,这是好事。但是我所不能理解的是已经获得"所有文件管理"权限的APP为何还是限制了,岂不是完全不留给清理、文件管理类软件后路?实在不应该!

    作为普通安卓用户该如何方便快速地访问Android/data目录

    众所周知,不能访问Android/data目录非常不方便,比如要管理QQ、微信接收到的文件、其他App下载的数据(如迅雷等等)。

    现本人开发的应用已实现无Root访问Android/data目录(其中文件浏览器功能),并且可以方便地进行管理。

    https://www.coolapk.com/apk/com.magicalstory.cleaner

    软件下载

    欢迎安卓手机用户下载使用 和 Android开发者下载预览功能的实现。

    App界面预览
    在这里插入图片描述

    开发者该如何实现无ROOT访问Data目录

    1.首先,可根据需要获取所有文件管理权限:
    在清单中声明:

        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission
            android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
            tools:ignore="ScopedStorage" />
    

    2.动态获取读写权限,这个不用多说了吧,如果觉得麻烦可以使用郭霖大神的permissionX库
    Github

    关于"管理所有文件"权限
    这个权限可以让你的App跟Android11以前一样,通过File API访问所有文件(除Android/data目录)

    如有需要,请在清单声明不启用沙盒存储

            android:preserveLegacyExternalStorage="true"
            android:requestLegacyExternalStorage="true"
    

    相关判断

       //判断是否需要所有文件权限
                if (!(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !Environment.isExternalStorageManager())) {
                //表明已经有这个权限了
                }
    

    获取权限

      Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
                startActivity(intent);
    

    正式开始解决Android/data问题

    首先,使用的方式是SAF框架(Android Storage Access Framework)
    这个框架在Android4.4就引入了,如果没有了解过的话,可以百度。

    获取某个文件目录的权限

    方法很简单,使用android.intent.action.OPEN_DOCUMENT_TREE(调用SAF框架的文件选择器选择一个文件夹)的Intent就可以授权了
    等下会放出工具类,现在看下例子:

    //获取指定目录的访问权限
     public static void startFor(String path, Activity context, int REQUEST_CODE_FOR_DIR) {
            statusHolder.path = path;//这里主要是我的一个状态保存类,说明现在获取权限的路径是他,大家不用管。
            String uri = changeToUri(path);//调用方法,把path转换成可解析的uri文本,这个方法在下面会公布
            Uri parse = Uri.parse(uri);
            Intent intent = new Intent("android.intent.action.OPEN_DOCUMENT_TREE");
            intent.addFlags(
                    Intent.FLAG_GRANT_READ_URI_PERMISSION
                            | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
                            | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
                            | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, parse);
            }
            context.startActivityForResult(intent, REQUEST_CODE_FOR_DIR);//开始授权
        }
    

    调用后的示意图:
    在这里插入图片描述

    回调并永久保存某个目录的权限

        //返回授权状态
        @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            Uri uri;
    
            if (data == null) {
                return;
            }
    
            if (requestCode == REQUEST_CODE_FOR_DIR && (uri = data.getData()) != null) {
                getContentResolver().takePersistableUriPermission(uri, data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION
                        | Intent.FLAG_GRANT_WRITE_URI_PERMISSION));//关键是这里,这个就是保存这个目录的访问权限
                PreferencesUtil.saveString(MainActivity.this, statusHolder.path + "授权", "true");//我自己处理的逻辑,大家不用管
    
            }
    
        }
    
    

    权限授权并永久保存成功
    在这里插入图片描述

    通过DocumentFile Api访问目录

    使用起来非常简单
    先看看怎么生成DocumentFile对象

    DocumentFile documentFile = DocumentFile.fromTreeUri(context, Uri.parse(fileUriUtils.changeToUri3(path)));
    //changeToUri3方法是我封装好的方法,后面会用到,这个是通过path生成指定可解析URI的方法
    

    真所谓有手就行,调用DocumentFile.fromTreeUri()方法就可以了,这个方法说的是从一个文件夹URI生成DocumentFile对象(treeUri就是文件夹URI)

    当然还有其他方法:
    DocumentFile.fromSingleUri();
    DocumentFile.fromFile();
    DocumentFile.isDocumentUri();

    看名字就明白了,但是我们有的的是一个文件夹uri,当然使用这个方法来生成DocumentFile对象,不同方法生成的DocumentFile对象有不同效果,如果你用fromTreeUri生成的默认是文件夹对象,有ListFiles() 方法
    DocumentFile.ListFiles()也就是列出文件夹里面的全部子文件,类似于File.listFiles()方法

    然后就这样啊,得到了DocumentFile对象就可以进行骚操作了啊,比如列出子文件啊,删除文件啊,移动啊,删除啊什么的都可以,没错,Android/data目录就是这样进行操作和访问的!

    实现遍历或管理Android/data文件目录

    比较基础,我就不多说啦,简单讲讲实现方案和踩过的坑

    1.遍历,跟普通全遍历没啥差别,但是不能通过直接传入Path进行遍历

    
        //遍历示例,不进行额外逻辑处理
        void getFiles(DocumentFile documentFile) {
            Log.d("文件:", documentFile.getName());
            if (documentFile.isDirectory()) {
                for (DocumentFile file : documentFile.listFiles()) {
                    Log.d("子文件", file.getName());
                    if (file.isDirectory()) {
                        getFiles(file);//递归调用
                    }
                }
                
            }
        }
    

    2.实现文件管理器方案(管理Android/data目录就是这个方案)
    以下仅介绍方法

     class file{
            String title;
            DocumentFile documentFile;
    
            public String getTitle() {
                return title;
            }
    
            public void setTitle(String title) {
                this.title = title;
            }
    
            public DocumentFile getDocumentFile() {
                return documentFile;
            }
    
            public void setDocumentFile(DocumentFile documentFile) {
                this.documentFile = documentFile;
            }
        }
    
        MainActivity{
            //加载数据
            void getFiles(DocumentFile documentFile) {
                ArrayList<file> arrayList = new ArrayList<>();
                if (documentFile.isDirectory()) {
                    for (DocumentFile documentFile_inner : documentFile.listFiles()) {
                        file file = new file();
                        file.setTitle(documentFile_inner.getName());
                        file.setDocumentFile(documentFile_inner);
                    }
                }
            }
            }
        }
    

    当列表被点击了,处理方案:

      public void onclick(int postion){
           file file = arrayList.get(postion);
           getFiles(file.getDocumentFile());//获取该文件夹的document对象,再把该文件夹遍历出来
           //然后再次显示就完事了
       }
    
    

    以上就是模拟实现文件管理器->文件浏览功能,大家应该一目了然,只介绍方案。

    我实现的文件管理(Android11上直接免root管理data目录)
    在这里插入图片描述

    重要的坑:为什么不直接使用路径Path来实现文件浏览呢?

    对呀,很明显使用传统的通过文件的path来实现文件管理岂不是更加方便?
    我也这样觉得的,在我当时在对Android11进行适配的时候为了改动小,肯定是想用这个方法来进行适配,但是根本行不通!

    我们不是获取了Android/data目录的权限了吗? 明明说好的获取该目录的权限后拥有该文件夹及所有子文件的读写权限的!
    我为什么不能直接通过调用changToUri把path转换成uri,再生成DocumentFile对象呢?
    这样岂不是更加方便嘛? 而且SAF的文件效率比File低多了。
    但是试了好几次后,我确定这样是不行的!

    就算你生成的是Android/data目录下子文件的正确URI,再生成DocumentFile对象,还是不行,因为你生成的DocumentFile对象始终指向Android/data(也就是你授权过的那个目录), 无解!

    刚刚开始我还以为是我生成的URI不正确,但是当我尝试再次把我想获取的子目录路径进行文件目录授权后,再用同一个URI生成DocumentFile对象却能指向正正确目录了。

    看到这里大家应该懂了吧,是谷歌对没有授权的子文件夹目录进行了限制,不让你直接通过TreeUri生成正确的Docment对象,至少在Android/data目录是这样的。

    现在是不是觉得谷歌官方解释: 获取该目录的权限后拥有该文件夹及所有子文件的读写权限的!
    是放屁?确实是!

    解决方案

    既然我们不能直接生成不了已授权目录的子目录DocumentFile对象,那我能不能试试直接对应子路径生成DocumentFile对象(非treeUri),我们试试用fromSingleUri()方法:

        //根据路径获得document文件
        public static DocumentFile getDoucmentFile(Context context, String path) {
            if (path.endsWith("/")) {
                path = path.substring(0, path.length() - 1);
            }
            String path2 = path.replace("/storage/emulated/0/", "").replace("/", "%2F");
            return DocumentFile.fromSingleUri(context, Uri.parse("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata/document/primary%3A" + path2));
        }
    

    很显然,可以了!可以生成正确的DocumentFile对象了,我们又可以用它来做一些好玩的东西了,比如直接通过path生成DocumentFile对象对某个文件获取大小啊、判断存在状态啊,等等。
    这个Android11上Android/data受限后,我觉得这个是很好的解决方案了,毕竟可以实现无Root访问并实现管理。

    SAF方案缺点

    很显然,通过SAF文件存储框架访问文件,速度和效率远远低于File API,因为SAF本来用途就不是用来解决Android11/data目录文件访问的。

    但是对于一些涉及文件管理类的App来说目前这个算是最全或较优的解决方案了。

    放大招,ROOT权限直接解锁后带权访问Data目录

    通过ROOT权限执行
    "chmod -R 777 /storage/emulated/0/Android/data"
    命令就可以解锁Android/data目录,注意:不可逆。

    至于怎么通过ROOT权限访问目录,就需要参考MT文件管理器或张海大神开源的文件管理器了

    Github
    Github:https://github.com/zhanghai/MaterialFiles

    结语

    以上就是我的解决方案了,已经完全解决Android11系统访问Android/data的问题,有问题可以留言哦,我看到会回复的,如果您有更好的解决的方案请在评论区留言,我会及时更新上去。

    当然,这个方案肯定会有些不如意,但是这已经是没方案中的最好的办法,毕竟谷歌限制不让你访问data目录,我们某些涉及文件管理的应用又确实需要访问,方案亲测可用,我已经按照以上方案在我的app中进行了Android11适配,算是差强人意吧。

    我的App:
    软件下载
    https://www.coolapk.com/apk/com.magicalstory.cleaner
    欢迎各位看官下载体验。

    封装好的工具类

    因为个人项目还在运营不方便把全部代码都开源至GitHub,所以就放出工具类给大家使用吧。
    真的超级简单呀,认真看一遍就可以上手了,都是日常操作,对于各位大佬来说就是有手就行。

    public class fileUriUtils {
        public static String root = Environment.getExternalStorageDirectory().getPath() + "/";
    
        public static String treeToPath(String path) {
            String path2;
            if (path.contains("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata/document/primary")) {
                path2 = path.replace("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata/document/primary%3A", root);
                path2 = path2.replace("%2F", "/");
            } else {
                path2 = root + textUtils.getSubString(path + "测试", "document/primary%3A", "测试").replace("%2F", "/");
    
            }
            return path2;
        }
    
    
        //判断是否已经获取了Data权限,改改逻辑就能判断其他目录,懂得都懂
        public static boolean isGrant(Context context) {
            for (UriPermission persistedUriPermission : context.getContentResolver().getPersistedUriPermissions()) {
                if (persistedUriPermission.isReadPermission() && persistedUriPermission.getUri().toString().equals("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata")) {
                    return true;
                }
            }
            return false;
        }
    
        //直接返回DocumentFile
        public static DocumentFile getDocumentFilePath(Context context, String path, String sdCardUri) {
            DocumentFile document = DocumentFile.fromTreeUri(context, Uri.parse(sdCardUri));
            String[] parts = path.split("/");
            for (int i = 3; i < parts.length; i++) {
                document = document.findFile(parts[i]);
            }
            return document;
        }
    
        //转换至uriTree的路径
        public static String changeToUri(String path) {
            if (path.endsWith("/")) {
                path = path.substring(0, path.length() - 1);
            }
            String path2 = path.replace("/storage/emulated/0/", "").replace("/", "%2F");
            return "content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata/document/primary%3A" + path2;
        }
    
        //转换至uriTree的路径
        public static DocumentFile getDoucmentFile(Context context, String path) {
            if (path.endsWith("/")) {
                path = path.substring(0, path.length() - 1);
            }
            String path2 = path.replace("/storage/emulated/0/", "").replace("/", "%2F");
            return DocumentFile.fromSingleUri(context, Uri.parse("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata/document/primary%3A" + path2));
        }
    
    
        //转换至uriTree的路径
        public static String changeToUri2(String path) {
            String[] paths = path.replaceAll("/storage/emulated/0/Android/data", "").split("/");
            StringBuilder stringBuilder = new StringBuilder("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata/document/primary%3AAndroid%2Fdata");
            for (String p : paths) {
                if (p.length() == 0) continue;
                stringBuilder.append("%2F").append(p);
            }
            return stringBuilder.toString();
    
        }
    
    
        //转换至uriTree的路径
        public static String changeToUri3(String path) {
            path = path.replace("/storage/emulated/0/", "").replace("/", "%2F");
            return ("content://com.android.externalstorage.documents/tree/primary%3A" + path);
    
        }
    
    //获取指定目录的权限
        public static void startFor(String path, Activity context, int REQUEST_CODE_FOR_DIR) {
            statusHolder.path = path;
            String uri = changeToUri(path);
            Uri parse = Uri.parse(uri);
            Intent intent = new Intent("android.intent.action.OPEN_DOCUMENT_TREE");
            intent.addFlags(
                    Intent.FLAG_GRANT_READ_URI_PERMISSION
                            | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
                            | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
                            | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, parse);
            }
            context.startActivityForResult(intent, REQUEST_CODE_FOR_DIR);
    
        }
    
    //直接获取data权限,推荐使用这种方案
        public static void startForRoot(Activity context, int REQUEST_CODE_FOR_DIR) {
            Uri uri1 = Uri.parse("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata");
    //        DocumentFile documentFile = DocumentFile.fromTreeUri(context, uri1);
            String uri = changeToUri(Environment.getExternalStorageDirectory().getPath());
            uri = uri + "/document/primary%3A" + Environment.getExternalStorageDirectory().getPath().replace("/storage/emulated/0/", "").replace("/", "%2F");
            Uri parse = Uri.parse(uri);
            DocumentFile documentFile = DocumentFile.fromTreeUri(context, uri1);
            Intent intent1 = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
            intent1.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
                    | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
                    | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
                    | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
            intent1.putExtra(DocumentsContract.EXTRA_INITIAL_URI, documentFile.getUri());
            context.startActivityForResult(intent1, REQUEST_CODE_FOR_DIR);
    
        }
    
    }
    
    
    展开全文
  • form-data: 就是multipart/form-data,将表单内要上传的数据,处理为一条消息,以标签为单元,一个个的隔开。既可以上传键值对,也可以上传文件。 multipart/form-data与x-www-form-urlencoded区别就是,multipart/...

    1、form-data: 

                       就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来说明文件类型;content-disposition,用来说明字段的一些信息;

    由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。

     

                     

    2、x-www-form-urlencoded:

                 就是application/x-www-from-urlencoded,会将表单内的数据转换为键值对,比如,name=java&age = 23

     

    3、raw

                可以上传任意格式的文本,可以上传text、json、xml、html等

    4、binary

              相当于Content-Type:application/octet-stream,从字面意思得知,只可以上传二进制数据,通常用来上传文件,由于没有键值,所以,一次只能上传一个文件。

     

     

    multipart/form-data与x-www-form-urlencoded区别

                   multipart/form-data:既可以上传文件等二进制数据,也可以上传表单键值对,只是最后会转化为一条信息;

                   x-www-form-urlencoded:只能上传键值对,并且键值对都是间隔分开的。

     

    参考资料:postman doc

     

    请关注个人公众号

    个人公众号

     

     

    展开全文
  • HTTP协议之multipart/form-data请求分析

    万次阅读 多人点赞 2012-01-06 15:36:34
    无意中发现了一个巨牛的人工智能教程,忍...首先来了解什么是multipart/form-data请求: 根据http/1.1 rfc 2616的协议规定,我们的请求方式只有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE等,那为为何我们还...

    无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。

    首先来了解什么是multipart/form-data请求:

    根据http/1.1 rfc 2616的协议规定,我们的请求方式只有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE等,那为为何我们还会有multipart/form-data请求之说呢?这就要从头来说了。

    http协议大家都知道是规定了以ASCII码传输,建立在tcp、ip协议之上的应用层规范,规范内容把http请求分为3个部分:状态行,请求头,请求体。所有的方法、实现都是围绕如何运用和组织这三部分来完成的。换句话来说就是万变不离其中,只要我们了解了http请求的组成部分后,自然就可以应变任何实际工作中的需求和问题了。

    关于状态行,请求头,请求体等三部分的具体内容,大家可以参考官方的协议文档http://www.faqs.org/rfcs/rfc2616.html,这里主要分析multipart/form-data请求具体是怎么一回事。

    既然http协议本身的原始方法不支持multipart/form-data请求,那这个请求自然就是由这些原始的方法演变而来的,具体如何演变且看下文:

    • multipart/form-data的基础是post请求,即基于post请求来实现的
    • multipart/form-data形式的post与普通post请求的不同之处体现在请求头,请求体2个部分

    multipart/form-data请求头:

    必须包含Content-Type信息,且其值也必须规定为multipart/form-data,同时还需要规定一个内容分割符用于分割请求体中不同参数的内容(普通post请求的参数分割符默认为&,参数与参数值的分隔符为=)。具体的头信息格式如下:

    Content-Type: multipart/form-data; boundary=${bound}    

    其中${bound} 是一个占位符,代表我们规定的具体分割符;可以自己任意规定,但为了避免和正常文本重复了,尽量要使用复杂一点的内容。如:--------------------56423498738365

    样例:

    Content-Type: multipart/form-data; boundary=--------------------56423498738365


    multipart/form-data请求体:

    它也是一个字符串,不过和普通post请求体不同的是它的构造方式。普通post请求体是简单的键值对连接,格式如下:

    k1=v1&k2=v2&k3=v3

    而multipart/form-data则是添加了分隔符、参数描述信息等内容的构造体。具体格式如下:

    ${bound}
    Content-Disposition: form-data; name="Filename"
    
    HTTP.pdf
    ${bound}
    Content-Disposition: form-data; name="file000"; filename="HTTP协议详解.pdf"
    Content-Type: application/octet-stream
    
    %PDF-1.5
    file content
    %%EOF
    ${bound}
    Content-Disposition: form-data; name="Upload"
    
    Submit Query
    ${bound}--

    其中${bound}就是之前请求头信息中的分割符,如果头信息中规定为123,那么这里也要为123(其作用等同于普通post请求中的&符号的作用,即分割参数)。很明显如果按照之前请求头的样例来,则这里的${bound}值应该替换为--------------------56423498738365,注意最后一个${bound}后需要固定添加两个横杆--

    另外可以很容易的看出,这个请求体被分隔符划分为3个部分,而每个部分其实就是一个参数的键值描述(其作用等同于普通post请求的k1=v1的部分),但对参数信息的描述可以比普通post请求更加丰富,这就是为什么multipart/form-data能发送文件的原因。

    每一个部分都是以分隔符开始的,接着是该部分内容的描述信息,然后是一个回车,最后是描述信息的具体内容。如果传送的内容是一个文件的话,那么还会包含文件名信息,以及文件内容的类型;上面的第二个小部分其实是一个文件体的结构,最后的分割符后会以--结尾,表示请求体结束。

    综上,可以知道要发送一个multipart/form-data的请求,其实任何支持post请求的工具或语言都可以支持,只是自己要稍微包装一下便可。

     

    参考资料:

    百度百科: http://baike.baidu.com/view/9472.htm  

    http1.1协议规范: http://www.faqs.org/rfcs/rfc2616.html

    分析工具:httpAnalyzer

     

    ==========================纯文本格式分割线=========================

     

    Header = {"Content-type" : "multipart/form-data, boundary=AaB03x"}
    
    Data =	"--AaB03x\r\n" +
    		"content-disposition: form-data; name=\"field1\"\r\n" +
    		"\r\n" + 
    		"Joe Blow\r\n" +
    		"--AaB03x\r\n" +
    		"content-disposition: form-data; name="pics"; filename=\"file1.txt\"\r\n" +
    		"Content-Type: text/plain\r\n" +
    		"\r\n" +
    		"...binary contents of file1.txt ...\r\n" +
    		"--AaB03x--\r\n"

    其中:...binary contents of file1.txt ... 要替换成真实的文件二进制内容。

    ===========================请求代码分割线============================

     

     

    如何使用Python发送multipart/form-data请求,请查看 http://blog.csdn.net/five3/article/details/74913742

    展开全文
  • 【Jmeter】参数Parameters和Body Data

    万次阅读 多人点赞 2016-05-31 19:03:56
    在做接口并发测试的时候,才发现Jmeter中的Parameters和Body Data两种参数格式并不是简单的一个是xx=xx,另外一个是json格式的参数先看一个接口[post] /api/xx/xxxx/xxxx 通知服务端文件上传完毕输入参数:...
  • spring data 简介(一)

    万次阅读 2018-09-05 11:19:48
    Spring Data 概述 JPA Spring Data 概述 Spring Data JPA HelloWorld Repository 接口 Repository 子接口 Spring DataRepository 查询方法定义规范 spring data 支持的关键字 级联查询 Spring Data 概述 ...
  • 遇到的问题一: error: RPC failed; curl 18 transfer closed with outstanding read data remaining fatal: The remote end hung up unexpectedly fatal: early EOF fatal: index-pack fail...
  • Data truncated for column at row

    万次阅读 2016-05-01 20:59:47
    Mysql在插入数据时提示: Data truncated for column 'uuid' at row 1 这个错误,其实就是插入的数据不合法造成的, 比如:乱码,超出字段长度,非法字符等, 我这里的插入的数据超出字段长度造成的。。。
  • Nominal data 与Ordinal data区别

    千次阅读 2019-04-17 11:16:49
    Nominal data 与Ordinal data均指向类别数据;如果类别数据不存在排序问题就是norminal data;如果存在 排序就是ordinal data
  • Vue里的data声明方式:data{},data(){}

    万次阅读 多人点赞 2019-09-04 11:18:09
    在简单的vue实例中看到的Vue实例中data属性是如下方式展示的: let app= newVue({ el:"#app", data:{ msg:'' }, methods:{ } }) 在使用组件化的项目中使用的是如下形式: export default{ data(){ ...
  • DataGrip 入门操作

    万次阅读 多人点赞 2019-03-14 14:49:21
    DataGrip使用入门(一) —— 安装与数据源管理 (2019-05-21更新,更新内容,往后翻) (本人DateGrip version:2018.3.4, 借鉴 version 2016.2 无大差异) 下载地址:...
  • @Data注解

    万次阅读 2019-08-10 16:47:51
    常常需要应用大量的get、set方法,需要写大量的重复代码,即有的工具有自动生成功能,当时也会使实体类中产生大量冗余代码,使得代码变,springboot为我们提供了相应注解可以解决这类问题----@Data 接下来简明扼要...
  • UE4 使用Unreal Datasmith完全教程

    万次阅读 热门讨论 2018-07-31 18:09:00
    (2019.12.9)Datasmith功能已内置到虚幻4.24版本 效果可以看这里:草图大师SU导入Unity和虚幻UE4对比 Datasmith图标消失看这里:Datasmith图标消失解决 虚幻官方中文文档:虚幻Datasmith(已更新中文文档) ...
  • RO-data、RW-data、ZI-data的解释

    千次阅读 2019-03-14 17:58:07
    KEIL MDK 查看代码量、RAM使用情况–RO-data、RW-data、ZI-data的解释 KEIL RVMDK编译后的信息 Program Size: Code=86496 RO-data=9064 RW-data=1452 ZI-data=16116 Code是代码占用的空间; RO-data是 Read Only 只读...
  • 在数据挖掘的很多领域,数据内容往往以.data形式给出,因此读取data文件到矩阵中并对异常值进行处理就变得很重要了。
  • 1 .bss .data .text 1.1 bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。 bss是英文Block Started by Symbol的简称。 bss段属于静态内存分配。 1.2 data段: 数据段(data ...
  • Structured data 和 Unstructured data

    千次阅读 2016-09-20 16:36:49
    Structured data refers to any data that resides in a fixed field within a record or file. This includes data contained in relational databases and spreadsheets.Structured data first depends on creat
  • 读取data文件

    万次阅读 2018-05-06 15:31:35
    在读取.data文件的时候,只能通过 with open(' ','r') as f: 进行读取,最后再保存为csv文件。该过程中通常是 1、先做a=strip().split('')处理,得到列表,但此时的a[i](i=1,2,...)是str属性, 如‘uid 130’,‘aid...
  • pytorch 多GPU训练总结(DataParallel的使用)

    万次阅读 多人点赞 2019-02-28 18:35:52
    这里记录用pytorch 多GPU训练 踩过的许多坑 仅针对单服务器多gpu 数据并行 而不是 多机器分布式训练 一、官方思路包装模型 这是pytorch 官方的原理图 按照这个官方的原理...上文也用dataParallel 包装了optimize...
  • vue中datadata()的区别

    千次阅读 2020-07-20 22:13:04
    Vue实例中data属性: new Vue({ el: '#app', data: { message: 'message' } }) 组件化的项目中使用: export default{ data(){ return { message: 'message' } } } 注意: 在大型项目中data会造成数据...
  • Bootstrap data-toggle data-target

    千次阅读 2019-05-19 16:17:31
    HTML5 新属性 data-toggle data-toggle指:以什么事件触发(常用的如modal, dropdown, tooltips等)。 data-target data-target指:事件的目标。
  • 成功解决Python的Reshape your data either using array.reshape(-1, 1) if your data has a single feature or 目录 解决问题 解决思路 解决方法 解决问题 今天写关于决策树的一些算法的时候,卧槽,...
  • vue重置data或者获取data初始值

    千次阅读 2019-12-03 20:50:19
    在某些情况我们可能要重置data上面的某些属性,比如在表单提交后需要清空form this.$data // 组件当前data对象 this.$options.data() // 组件初始化状态下的data对象 Object.assign(this.$data, this.$options.data...
  • Application data storage、Stored Data Protection、Cached and temp data、URL handlers、Binary protection
  • System Center Data Protection Manager 2019 Windows Server 2016 1.双击映像文件 2.安装SCDPM_2019.exe 3.选择解压的位置 4.找到解压的位置,运行setup.exe 5.点击Data Protection Manger 6.接受协议 7.下...
  • 数据库自定义函数执行失败,查日志看到报错信息: 报错信息: Attempted to convert SQLException to SQLException. Leaving it alone.... com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too lon...
  • Data Wrangling

    千次阅读 2018-04-17 23:19:35
    数据整理(Data Wrangling) 数据整理(Data Wrangling)可归纳为以下三步: - 数据收集(Gather) - 数据评估(Assess) - 数据清理(Clean) 数据收集(Gather) 收集数据的方式有很多,最简单、最常见的是下载...
  • 微信小程序中data-key属性:数据传输

    万次阅读 多人点赞 2019-10-15 20:20:49
    总结来说,data-key="{{...}}" 是往data中传数据(有后端的话是要给后端的),而data-key="..." 是从data(有后端的话是从后端先传给data接收)传到wxml页面中 怎么接收data-*的值 如下: <view bindtap="SetD...
  • STM32--Code、RO-data、RW-data和ZI-data

    千次阅读 2019-01-08 09:19:38
     RO-data: Read Only data,只读数据域,它指程序中用到的只读数据,这些数据被存储在ROM区,因而程序不能修改其内容。C语言中const关键字定义的变量就是典型的RO-data。  RW-data: Read Write data,可读写数据...
  • DataGrip连接Hive教程

    万次阅读 多人点赞 2019-11-20 21:30:41
    1. 从官网下载安装包 下载网址 2. 安装 第一步 ...使用安装idea的图 datagrip 与此类似 4. 配置Hive 第一步 第二步 第三步 可以在虚拟机上拷贝到本地 第四步 第五步 (看到如下信息即为成功) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,701,994
精华内容 680,797
关键字:

data