使用http请求发送文件,文件标题乱码

Crq
Crq
管理员
1726
文章
0
粉丝
Linux教程评论36字数 319阅读1分3秒阅读模式
摘要我们经常遇到,使用http请求发送文件,文件标题乱码(内容正确),这样的情况要怎么解决呢?

使用http请求发送文件,文件标题乱码

项目中的代码大致如下:
最终的结果是,文件上送成功,文件的内容正常,但是文件的标题乱码。

InputStream is = null;
DataOutputStream dos = null;
// 读取文件标题
String fileName = "文件标题";
// (方式1)将字符串直接写入
dos.writeBytes(buildHttpRequest(fileName));
// (方式2)将字符串以字节的形式写入
dos.write(buildHttpRequest(fileName).getBytes());
dos.flush();
// 读取文件内容
is = new FileInputStream("文件File对象");
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1){
    dos.write(buffer,0,len);
}
dos.writeBytes(LINE_END);
// 构建对应的请求信息(不重要)
public String buildHttpRequest(String fileName){
    StringBuffer sb = new StringBuffer();
    sb.append(PREFIX)
    .append(BOUNDARY)
    .append(LINE_END)
    .append("Content-Disposition: form-data; name=\"file\"; filename=\""
            + fileName + "\"" + LINE_END)
    // 文件上送形式
    .append("Content-Type: application/octet-stream" + LINE_END)
    // 文件上送类型
    .append("Content-Transfer-Encoding: binary" + LINE_END)
    .append(LINE_END);
    return sb.toString();
}
 

使用方式1导致出现标题乱码,需要修改为方式2
writeBytes将中文标题中的字符串强转为了byte字节,会丢失精度(char16位,byte8位)。正确处理方式应该是,将String字符串先转化成byte数组,然后使用write方法直接把byte数组进行写入,这样就不会丢失精度了。
writeBytes方法:

public final void writeBytes(String s) throws IOException {
    int len = s.length();
    for (int i = 0 ; i 

write方法:

 public void write(byte b[]) throws IOException {
    write(b, 0, b.length);
}
 

weinxin
我的微信
微信号已复制
我的微信
这是我的微信扫一扫
 
Crq
  • 本文由 Crq 发表于2025年2月6日 15:18:57
  • 转载请注明:https://www.cncrq.com/12937.html
在 RHEL 7.1 上设置 Mesos/Marathon 集群 Linux教程

在 RHEL 7.1 上设置 Mesos/Marathon 集群

Mesos 是一套分布式集群管理器,旨在通过以动态方式于不同任务之间共享资源的方式改进资源使用率;Marathon 是一套用于在 Mesos 之上运行长期运行应用程序或者服务的框架...
文件共享神器:NitroShare Linux教程

文件共享神器:NitroShare

网络的最重要用途之一就是实现文件共享的目的,现在,虽然有多种方式可以让在同一网络中的 Linux 和 Windows 以及 MacOS X 用户之间共享文件,让我们认识下 Nitr...
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证