V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
vagrant
V2EX  ›  问与答

android 上传图片或文件都是怎么弄的?

  •  
  •   vagrant · 2015-03-26 08:51:08 +08:00 · 4194 次点击
    这是一个创建于 3326 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我google到的方法: 1.自己构造multipary 2.使用MultipartyEntity. 3.第三方开源库如android-aync-http

    我想请问下,各位实际上怎么向服务器传图片的? 如果上传图片的同时增加图片描述之类的字段呢?
    23 条回复    2015-03-26 13:27:17 +08:00
    clanned
        1
    clanned  
       2015-03-26 09:16:58 +08:00
    用http post,图片二进制做base64编码,其他参数同等的post参数,服务器解析base64再存图片就行了
    vagrant
        2
    vagrant  
    OP
       2015-03-26 09:35:24 +08:00
    @xdtianyu 这样需要服务器也做base64解码,关键是现在服务器已写好,只提供了一个api 要求post图片过去,同时需要传递一个String类型的参数过去。
    clanned
        3
    clanned  
       2015-03-26 09:37:36 +08:00
    @vagrant 服务器既然已经写好就按照写服务的人要求的规范来上传啊,他要是没有测试过就开放接口出来就是服务端的问题了。
    vagrant
        4
    vagrant  
    OP
       2015-03-26 09:48:57 +08:00
    @xdtianyu 所以我的问题是在服务器api写好的情况下, 怎么post图片和字段过去,因为是别人写的服务器端api, 只给了api地址和可传的字段的描述
    liangzhitao
        5
    liangzhitao  
       2015-03-26 09:52:23 +08:00
    我们是用的七牛,你看下七牛的具体怎么实现的。
    qiayue
        6
    qiayue  
       2015-03-26 09:53:59 +08:00
    multipart
    这样后端不仅能接收你客户端的上传,也能接收网页的表单图片上传
    vagrant
        7
    vagrant  
    OP
       2015-03-26 09:55:09 +08:00
    @qiayue 自己构造那一堆参数吗?如果同时需要传图片和字段呢?
    vagrant
        8
    vagrant  
    OP
       2015-03-26 09:56:26 +08:00
    @liangzhitao 这个好像没什么关系吧?
    kirisetsz
        9
    kirisetsz  
       2015-03-26 10:01:56 +08:00 via Android
    用 Spring 的话有 HttpEntity 对象可以用来构造实体…
    Retrofit 干脆什么都不用配置在 Interface 方法上加注 multipart 标签就好了。
    手工构造一定是姿势不对咯 ('・ω・') 不过手工构造可读性也不错呢… 只是强迫症无法接受…
    vagrant
        10
    vagrant  
    OP
       2015-03-26 10:14:31 +08:00
    @kirisetsz 请问下你说的HttpEntity大概是怎么实现的? 还有你上传图片都是怎么实现的呢? 不胜感激。纠结这问题很久了。
    finian
        11
    finian  
       2015-03-26 12:29:53 +08:00   ❤️ 1
    看了你前面的回复,既然「关键是现在服务器已写好」,那就按服务器提供的 API 传,你说一下那个传图片的 API 具体长啥样
    vagrant
        12
    vagrant  
    OP
       2015-03-26 12:38:18 +08:00
    @finian

    http://****/upload POST请求
    字段 类型 描述 备注 值条件
    method String 上传头像的方法 logo 必填

    这种形式 需要传图片过去,也需要弄个字段。没做过图片上传,请问 怎么做?
    vagrant
        13
    vagrant  
    OP
       2015-03-26 12:40:46 +08:00   ❤️ 1
    @finian 而我得到的图片是一个Bitmap
    finian
        14
    finian  
       2015-03-26 12:48:54 +08:00
    @vagrant 你们这 API 压根就没描述怎么传图片数据啊,请求体是用 multipart/form-data 呢还是 application/x-www-form-urlencoded 呢还是其他什么鬼,不写清楚让客户端怎么传。。。所以你还是先去问清楚这个 API 是以什么格式传的数据吧
    qiayue
        15
    qiayue  
       2015-03-26 12:51:18 +08:00 via Android
    @finian 没写的话,我怀疑默认是 multipart/form-data
    clanned
        16
    clanned  
       2015-03-26 12:53:54 +08:00
    @vagrant 点错感谢了

    你那个api接口还是api的描述啊,要是服务端给你的接口你就去找服务端把详细的接收参数拿出来,具体post的是什么,“字段 类型 描述 备注 值条件”这些具体是什么字符难不成直接中文。图片上传是什么另类?post请求就是post请求,http传递的到底也就是字节流。Bitmap转到byte[]作为参数传出去。
    vagrant
        17
    vagrant  
    OP
       2015-03-26 13:00:52 +08:00
    @finian 格式不重要 我这边知道 我想知道的是 post过去的方法?
    finian
        18
    finian  
       2015-03-26 13:05:08 +08:00
    @qiayue 嗯,所以这个 API 描述就有问题,默认是 multipart/form-data 的话,还要指定接收图片的 name 字段、具体的图片数据的编码格式,这些信息都不知道的话客户端根本就没法调用
    vagrant
        19
    vagrant  
    OP
       2015-03-26 13:07:00 +08:00
    @qiayue 我想知道的是怎么写过去 用HttpURLConnection写在流中? 还是用HttpClient? 还是怎么弄?
    finian
        20
    finian  
       2015-03-26 13:08:20 +08:00
    @vagrant 。。。那你就说是什么格式的吧,按照这种格式去 post 数据就行,Android 很多网络库都有封装好的方法直接调用就行
    finian
        21
    finian  
       2015-03-26 13:13:47 +08:00
    @vagrant 这样吧,你先说清楚请求体的 Content-Type 究竟是什么类型?multipart/form-data 还是 application/x-www-form-urlencoded 还是你们自定义的格式
    vagrant
        22
    vagrant  
    OP
       2015-03-26 13:17:16 +08:00
    @finian multipart/form-data 我想知道怎么传过去,一般参数的api地址的Content-Type是 application/x-www-form-urlencoded直接写入得到的输出流就可以了, 但是我不知道对于multipart/form-data 怎么同时弄图片和参数?
    finian
        23
    finian  
       2015-03-26 13:27:17 +08:00
    @vagrant 如果是 multipart/form-data 的话,那你的请求体就是类似这样的:

    ...
    Content-Type: multipart/form-data; boundary=xxx

    --xxx
    Content-Disposition: form-data; name="foo"

    bar
    --xxx
    Content-Disposition: form-data; name="pic"
    Content-Type: application/octet-stream

    <图片二进制数据>
    --xxx--

    所以你传图片数据(还有额外参数)时,按照 multipart/form-data 的格式构造请求体 post 过去就行。建议你用开源库,比如 OkHttp 之类的,构造请求体的方法都是封装好的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1867 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 16:12 · PVG 00:12 · LAX 09:12 · JFK 12:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.