android 上传图片或文件都是怎么弄的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vagrant
V2EX    问与答

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

  •  
  •   vagrant 2015-03-26 08:51:08 +08:00 4650 次点击
    这是一个创建于 3919 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我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  
    PRO
       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  
    PRO
       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     Solana     5496 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 01:46 PVG 09:46 LAX 17:46 JFK 20:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86