【问题标题】:Java/PNG upload to .phpJava/PNG 上传到 .php
【发布时间】:2011-08-05 12:49:30
【问题描述】:

这是我使用记事本编辑本地 .png 文件时的内容:

http://i.stack.imgur.com/TjNGl.png

这是我使用记事本编辑上传的 .png 文件时的内容:

http://i.stack.imgur.com/2tXgN.png

为什么 'NUL' 会被 '\0' 取代?这会导致文件损坏且无法使用。

我使用这个java代码上传本地.png:

public static byte[] imageToByte(File file) throws FileNotFoundException {
    FileInputStream fis = new FileInputStream(file);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    byte[] buf = new byte[1024];
    try {
        for (int readNum; (readNum = fis.read(buf)) != -1;) {
            bos.write(buf, 0, readNum);
        }
    } catch (IOException ex) {
    }
    byte[] bytes = bos.toByteArray();
    return bytes;
}

public static void sendPostData(String url, HashMap<String, String> data)
        throws Exception {
    URL siteUrl = new URL(url);
    HttpURLConnection conn = (HttpURLConnection) siteUrl.openConnection();
    conn.setRequestMethod("POST");
    conn.setDoOutput(true);
    conn.setDoInput(true);

    DataOutputStream out = new DataOutputStream(conn.getOutputStream());

    Set keys = data.keySet();
    Iterator keyIter = keys.iterator();
    String content = "";
    for (int i = 0; keyIter.hasNext(); i++) {
        Object key = keyIter.next();
        if (i != 0) {
            content += "&";
        }
        content += key + "=" + URLEncoder.encode(data.get(key), "UTF-8");
    }
    System.out.println(content);
    out.writeBytes(content);
    out.flush();
    out.close();
    BufferedReader in = new BufferedReader(new InputStreamReader(
            conn.getInputStream()));
    String line = "";
    while ((line = in.readLine()) != null) {
        System.out.println(line);
    }
    in.close();
}

【问题讨论】:

    标签: java upload png httpurlconnection


    【解决方案1】:

    我只是猜测

    但我认为这就是 URLEncoder 的工作原理。它不能解码正确的字符字节。 看一下这个 http://www.w3schools.com/tags/ref_urlencode.asp

    NUL null character %00

    如果您可以访问您的网站 php.. 我建议将 png 数据的编码 base64 表示.. 发布到 PHP.. 然后在 php 端解码 base64.. 它将是 100% 准确的。由于 URLEncoding 接受所有 base64 字符。

    或者如果你超级懒惰并且仍然想使用 UrlEncoder,你可以用字节 0 替换每个 NUL,这会无缘无故地增加很多额外的处理。

    但话说回来,您始终可以使用multipart/form-data 上传数据,因为这需要更多工作..

    我建议现在快速修复一下,试试 base64 编码技巧。

    【讨论】:

      猜你喜欢
      • 2011-10-18
      • 2018-01-13
      • 2011-08-26
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 2017-02-13
      相关资源
      最近更新 更多