头像用post方法上传 获取的时候怎么解决微信头像上传模糊

查看: 870|回复: 6
在线时间6 小时威望0 金钱50 人气0 最后登录注册时间帖子精华0积分80阅读权限10UID200254
初级程序员, 积分 80, 距离下一级还需 120 积分
擂点0 人气0 威望0 注册时间精华0帖子
本帖最后由 w4nyy 于
12:24 编辑
喜马拉雅网,post上传头像始终失败,求大婶们帮忙!
这是抓的包Post数据------------Ef1KM7ei4ae0Ij5ei4Ef1Ij5gL6Ef1
Content-Disposition: form- name=&Filename&
...............
...............
中间这段是一大段乱码
...............
...............
016.jpg
------------Ef1KM7ei4ae0Ij5ei4Ef1Ij5gL6Ef1
Content-Disposition: form- name=&Filedata&; filename=&016.jpg&
Content-Type: application/octet-stream复制代码包头数据如下:
我写的post头像如下:Private Sub UpdataPic(sUrl As String, sFileName As String)
& & Dim PicBuffer() As Byte
& & Dim PostData As String
& & Dim UpdataPicCookie_POST As String
& & Dim Get30Wei As String
& & Dim UpdateTouXiangFanHui As String
& &
& & Get30Wei = Get30
& & Open sFileName For Binary As #4
& && &&&ReDim PicBuffer(0 To LOF(4) - 1) As Byte
& && && && &Get #4, , PicBuffer
& && &&&PostData = StrConv(PicBuffer, vbUnicode)
& & Close #4
& & PostData = &------------& & Get30Wei & vbCrLf & _
& & &Content-Disposition: form- name=&&Filename&&& & vbCrLf & vbCrLf & _
& & Mid$(sFileName, InStrRev(sFileName, &\&) + 1) & vbCrLf & _
& & &------------& & Get30Wei & vbCrLf & _
& & &Content-Disposition: form- name=&&Filedata&&; filename=&&& & Mid$(sFileName, InStrRev(sFileName, &\&) + 1) & &&&& & vbCrLf & _
& & &Content-Type: application/octet-stream& & vbCrLf & vbCrLf & _
& & PostData & _
& & &------------& & Get30Wei & vbCrLf & _
& & &Content-Disposition: form- name=&&Upload&&& & vbCrLf & vbCrLf & _
& & &Submit Query& & vbCrLf & _
& & &------------& & Get30Wei & &--&
& & With CreateObject(&Microsoft.XMLHTTP&)
& && &&&.Open &POST&, sUrl, True
& && &&&.SetRequestHeader &Content-Type&, &multipart/form- boundary=----------& & Get30Wei
& && &&&.SetRequestHeader &Cookie&, PostCookie
& && &&&.Send pvToByteArray(PostData)
& && &&&While .ReadyState && 4
& && && && &DoEvents
& && &&&Wend
& && &&&UpdateTouXiangFanHui = StrConv(.responseBody, vbUnicode)
& & End With
End Sub
Private Function pvToByteArray(sString As String) As Byte()
& & Dim adoStream As Object
& & Set adoStream = CreateObject(&ADODB.Stream&)
& & adoStream.Charset = &utf-8&
& & adoStream.Type = 2
& & adoStream.Open
& & adoStream.WriteText sString
& & adoStream.Position = 0
& & adoStream.Type = 1
& & GB2312ToUTF8 = adoStream.Read()
& & adoStream.Close
End Function复制代码上传头像始终不对,不知道哪的问题。求指导,谢谢!
在线时间2088 小时威望341 金钱6738 人气115 最后登录注册时间帖子精华1积分24301阅读权限200UID110914
网络设计师, 积分 24301, 距离下一级还需 7699 积分
擂点0 人气115 威望341 注册时间精华1帖子
有没有获取正确的Cookie?还是你直接拿抓包的Cookie?
工资就像月经,一个月来一次,一个星期就没了。
在线时间6 小时威望0 金钱50 人气0 最后登录注册时间帖子精华0积分80阅读权限10UID200254
初级程序员, 积分 80, 距离下一级还需 120 积分
擂点0 人气0 威望0 注册时间精华0帖子
admin6677 发表于
有没有获取正确的Cookie?还是你直接拿抓包的Cookie?
获取了正确的cookie,post的时候也加上cookie了
&那应该是OK的哦。你再检查检查你的协议咯。&
在线时间3 小时威望0 金钱187 人气0 最后登录注册时间帖子精华0积分105阅读权限10UID280792
初级程序员, 积分 105, 距离下一级还需 95 积分
擂点0 人气0 威望0 注册时间精华0帖子
(*^__^*) 嘻嘻……我只是拿经验的
在线时间6 小时威望0 金钱50 人气0 最后登录注册时间帖子精华0积分80阅读权限10UID200254
初级程序员, 积分 80, 距离下一级还需 120 积分
擂点0 人气0 威望0 注册时间精华0帖子
还是希望大神帮忙解惑!!!!
在线时间3044 小时威望3564 金钱77974 人气2379 最后登录注册时间帖子精华10积分70406阅读权限1UID24097
αcmε_ρjζ
擂点11 人气2379 威望3564 注册时间精华10帖子
PostData = StrConv(PicBuffer, vbUnicode)&&你这句话就完蛋了,把编码搞乱了,二进制数据不应该使用任何编码转换的,否则当前编码不能表示的字符统统变成问号
把自己用VB写过的的一些重要有用的程序改写成跨平台C++程序
在线时间6 小时威望0 金钱50 人气0 最后登录注册时间帖子精华0积分80阅读权限10UID200254
初级程序员, 积分 80, 距离下一级还需 120 积分
擂点0 人气0 威望0 注册时间精华0帖子
本帖最后由 w4nyy 于
13:23 编辑
acme_pjz 发表于
PostData = StrConv(PicBuffer, vbUnicode)&&你这句话就完蛋了,把编码搞乱了,二进制数据不应该使用任何编 ...
这块应该怎么转换呢,谢谢了!!!我把post的数据头部分和尾部分先转换成字节数组,然后和图片的字节数组用CopyMemory拼成一个字节数组,然后send出去,也是不行
第69期[混乱的顶点]擂主
第69期[混乱的顶点]擂主The page is temporarily unavailable
nginx error!
The page you are looking for is temporarily unavailable.
Please try again later.
Website Administrator
Something has triggered an error on your
This is the default error page for
nginx that is distributed with
It is located
/usr/share/nginx/html/50x.html
You should customize this error page for your own
site or edit the error_page directive in
the nginx configuration file
/etc/nginx/nginx.conf.假设接受文件的网页程序位于&.假设我们要发送一个图片文件,文件名为“kn.jpg”,
  首先客户端链接 192.168.24.56 后, 应该发送如下http 请求:
  POST&HTTP/1.1&
  Accept: text/plain, */*&  Accept-Language: zh-cn&  Host: 192.168.24.56  Content-Type:multipart/form-boundary=-----------------------------7db372eb000e2  User-Agent: WinHttpClient&  Content-Length: 3693  Connection: Keep-Alive
  -------------------------------7db372eb000e2
  Content-Disposition: form- name="file"; filename="kn.jpg"
  Content-Type: image/jpeg
  (此处省略jpeg文件二进制数据...)
  -------------------------------7db372eb000e2--
  此内容必须一字不差,包括最后的回车,红色字体部分就是协议的头。给服务器上传数据时,并非协议头每个字段都得说明,其中,content-type是必须的,它包括一个类似标志性质的名为boundary的标志,它可以是随便输入的字符串。对后面的具体内容也是必须的。它用来分辨一段内容的开始。Content-Length: 3693 ,这里的3693是要上传文件的总长度。绿色字体部分就是需要上传的数据,可以是文本,也可以是图片等。数据内容前面需要有Content-Disposition, Content-Type以及Content-Transfer-Encoding等说明字段。最后的紫色部分就是协议的结尾了。
  注意这一行:
  Content-Type: multipart/form- boundary=---------------------------7db372eb000e2  
  根据 rfc1867, multipart/form-data是必须的.&  ---------------------------7db372eb000e2&是分隔符,分隔多个文件、表单项。其中b372eb000e2&是即时生成的一个数字,用以确保整个分隔符不会在文件或表单项的内容中出现。Form每个部分用分隔符分割,分隔符之前必须加上"--"着两个字符(即--{boundary})才能被http协议认为是Form的分隔符,表示结束的话用在正确的分隔符后面添加"--"表示结束。
  前面的 ---------------------------7d 是 IE 特有的标志,Mozila 为---------------------------71.&
  每个分隔的数据的都可以用Content-Type来表示下面数据的类型,可以参考rfc1341 ()
  例如&:Contect-Type:image/jpeg 表示下面的数据是jpeg文件数据
============================================================================
[转]通过 http 协议上传文件
1、概述在最初的 http 协议中,没有上传文件方面的功能。 rfc1867 (&&) 为 http 协议添加了这个功能。客户端的浏览器,如 Microsoft IE, Mozila, Opera 等,按照此规范将用户指定的文件发送到服务器。服务器端的网页程序,如 php, asp, jsp 等,可以按照此规范,解析出用户发送来的文件。Microsoft IE, Mozila, Opera 已经支持此协议,在网页中使用一个特殊的 form 就可以发送文件。绝大部分 http server ,包括 tomcat ,已经支持此协议,可接受发送来的文件。各种网页程序,如 php, asp, jsp 中,对于上传文件已经做了很好的封装。
2、上传文件的实例:用 servelet 实现(http server 为 tomcat 4.1.24)1. 在一个 html 网页中,写一个如下的form :
&form&enctype="multipart/form-data"&action="http://192.168.29.65/UploadFile"&method=post&
&&& load multi files :&br&
&&& &input name="userfile1"&type="file"&&br&
&&& &input name="userfile2" type="file"&&br&
&&& &input name="userfile3" type="file"&&br&
&&& &input name="userfile4" type="file"&&br&
&&& text field :&input type="text" name="text" value="text"&&br&
&&& &input type="submit" value="提交"&&input type=reset&
2. 服务端 servelet 的编写现在第三方的 http upload file 工具库很多。Jarkata 项目本身就提供了fileupload 包&。文件上传、表单项处理、效率问题基本上都考虑到了。在 struts 中就使用了这个包,不过是用 struts 的方式另行封装了一次。这里我们直接使用 fileupload 包。至于struts 中的用法,请参阅 struts 相关文档。这个处理文件上传的 servelet 主要代码如下:
public void doPost( HttpServletRequest request, HttpServletResponse response ) {
&&& DiskFileUpload diskFileUpload = new DiskFileUpload();
&&& //&允许文件最大长度
&&& diskFileUpload.setSizeMax( 100* );
&&& //&设置内存缓冲大小
&&& diskFileUpload.setSizeThreshold( 4096 );
&&& //&设置临时目录
&&& diskFileUpload.setRepositoryPath( "c:/tmp" );
&&& List fileItems = diskFileUpload.parseRequest( request );
&&& Iterator iter = fileItems.iterator();
&&& for( ; iter.hasNext(); ) {
&&&&&&& FileItem fileItem = (FileItem) iter.next();
&&&&&&& if( fileItem.isFormField() ) {
&&&&&&&&&&& //&当前是一个表单项
&&&&&&&&&&& out.println( "form field : " + fileItem.getFieldName() + ", " + fileItem.getString() );
&&&&&&& } else {
&&&&&&&&&&& //&当前是一个上传的文件
&&&&&&&&&&& String fileName = fileItem.getName();
&&&&&&&&&&& fileItem.write( new File("c:/uploads/"+fileName) );
为简略起见,异常处理,文件重命名等细节没有写出。
3、 客户端发送内容构造
假设接受文件的网页程序位于&.假设我们要发送一个二进制文件、一个文本框表单项、一个密码框表单项。文件名为 E:\s ,其内容如下:(其中的XXX代表二进制数据,如 01 02 03)
客户端应该向 192.168.29.65 发送如下内容:
POST /upload_file/UploadFile HTTP/1.1
Accept: text/plain, */*
Accept-Language: zh-cn
Host: 192.168.29.65:80
Content-Type:multipart/form-boundary=---------------------------7d33a816d302b6
User-Agent: Mozilla/4.0 ( OpenOffice.org)
Content-Length: 424
Connection: Keep-Alive
-----------------------------7d33a816d302b6
Content-Disposition: form- name="userfile1";&filename="E:\s"
Content-Type: application/octet-stream
-----------------------------7d33a816d302b6
Content-Disposition: form- name="text1"
-----------------------------7d33a816d302b6
Content-Disposition: form- name="password1"
-----------------------------7d33a816d302b6--
此内容必须一字不差,包括最后的回车。注意:Content-Length: 424 这里的424是红色内容的总长度(包括最后的回车)注意这一行:Content-Type: multipart/form- boundary=---------------------------7d33a816d302b6根据 rfc1867, multipart/form-data是必须的.---------------------------7d33a816d302b6 是分隔符,分隔多个文件、表单项。其中33a816d302b6 是即时生成的一个数字,用以确保整个分隔符不会在文件或表单项的内容中出现。前面的 ---------------------------7d 是 IE 特有的标志。 Mozila 为---------------------------71用手工发送这个例子,在上述的 servlet 中检验通过。(上面有一个回车)用户可以选择多个文件,填写表单其它项,点击“提交”按钮后就开始上传给&这是一个 servelet 程序注意 enctype="multipart/form-data", method=post, type="file" 。根据 rfc1867, 这三个属性是必须的。multipart/form-data 是新增的编码类型,以提高二进制文件的传输效率。具体的解释请参阅 rfc1867
阅读(...) 评论()2330人阅读
移动开发(2)
最近和队友在做一个Android APP,昨天遇到用户上传头像,上传的头像图片需要上传至服务器的MySql数据库保存,当用户上传成功之后每次登陆后从数据库获取头像信息显示。
由于之前一直使用JSON作为客户端和服务器端数据传输形式,JSON虽然使用方便但是不支持自定义类型,所以遇到的问题就是将二进制图片文件转成String,再传到服务器并保存到数据库。
在查阅了一些资料后想出了一个方法:
1,将图片转换成Byte[]
2,利用Base64将Byte[]加密编码转换成String
3,利用JSON将String传到服务器,由于图片一般转换后的String 是很大的,所以在MySql中保存为MEDIUMTEXT类型。方便以后从数据库直接读出来通过JSON再返回客户端解析后显示。
4,显示时将从数据库读出来的String通过Base64解码成Byte[];
5,用BitmapFactory将Byte[]转换成Bitmap显示。
A客户端向服务器端发送:
private void edit_headPicture(Bitmap bitmap) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();//将Bitmap转成Byte[]
pressFormat.PNG, 50, baos);//压缩
headPicture =Base64.encodeToString(baos.toByteArray(),Base64.DEFAULT);//加密转换成String
int n=headPicture.length();
Thread submit=new Thread(new SubmitThread());
submit.start();
class SubmitThread implements Runnable
Message msg = handler.obtainMessage();
public void run() {
// TODO Auto-generated method stub
JSONObject object=new JSONObject();
object.put(&headPicture&, headPicture);
msg.what=Server(object);
handler.sendMessage(msg);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
public int Server(JSONObject object)
String path=LoginActivity.URL+&SetInfoManager&;
URL url=new URL(path);
String content = String.valueOf(object);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setDoOutput(true);
conn.setRequestMethod(&POST&);
conn.setRequestProperty(&User-Agent&, &Fiddler&);
conn.setRequestProperty(&Content-Type&, &application/json&);
OutputStream os = conn.getOutputStream();
os.write(content.getBytes());
os.close();
int code = conn.getResponseCode();
if(code == 200)
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String result=&&;
result = in.readLine();
in.close();
return Integer.parseInt(result);
else return 0;
}catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
B:服务器接收代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
StringBuffer buffer=new StringBuffer();
String line=&&;
request.setCharacterEncoding(&UTF-8&);
BufferedReader reader=request.getReader();
while((line=reader.readLine())!=null)
buffer.append(line);
JSONObject object=new JSONObject(buffer.toString());
int result=new SetInfoManagerDB(object).Update();
response.getOutputStream().write((result+&&).getBytes());
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
&span style=&white-space:pre&&
&/span& sql=&update companyview set headPicture=? where e_Name=?&;
stmt=conn.prepareStatement(sql);
stmt.setString(1, object.getString(&headPicture&));
stmt.setString(2, username);
stmt.executeUpdate();
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
C:客户端解析并显示:
String s=view.getString(&headPicture&);
if(s.equals(&&))
btn_user.setImageResource(R.drawable.ic_launcher);
byte[] bytes = Base64.decode(view.getString(&headPicture&), Base64.DEFAULT);
btn_user.setImageBitmap(BitmapFactory.decodeByteArray(bytes, 0, bytes.length));
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:14966次
排名:千里之外
原创:61篇
(1)(3)(10)(1)(24)(7)(10)(2)(7)

我要回帖

更多关于 ios post请求上传头像 的文章

 

随机推荐