java - 将文件上传到服务器保存的文件包含无效字符

标签 java php file-upload

我正在从我的 java 应用程序将文件上传到 php 服务器,它上传的一切都很好,但我注意到如果它包含诸如 ' 之类的字符,那么文件中的它将是\' 而不是 '

例如,如果我在 java 中使用以下代码上传文件:

public static void main(String[] args)
{
    FILE tmpFile = new FILE(EncryptionUtil.EncryptAndZip("tes't file.txt").getAbsoluteFile().toString());

    postData
    (
        UPLOAD_URL + "?filename=" + URLEncoder.encode(file.getFileName() + ".zip", "utf-8"),
        tmpFile.getFileName() + ".zip",
        tmpFile.getFileLoader().readAllBytes() // FILE.getFileLoader().readAllBytes() is just a wrapper and reads all bytes from a file to byte[]
    );
}

private static final String CrLf = "\r\n";
public static void postData(String url, String filename, byte[] byteData) throws IOException
{
    URLConnection conn = null;
    InputStream is = null;
    OutputStream os = null;

    try
    {
        URL obj = new URL(url);
        System.out.println("url:" + obj);
        conn = obj.openConnection();
        conn.setDoOutput(true);

        String message1 = "";
        message1 += "-----------------------------4664151417711" + CrLf;
        message1 += "Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"" + filename + "\""
                + CrLf;
        message1 += "Content-Type: application/octet-stream" + CrLf;
        message1 += CrLf;

        String message2 = "";
        message2 += CrLf + "-----------------------------4664151417711--"
                + CrLf;

        conn.setRequestProperty("Content-Type",
                "multipart/form-data; boundary=---------------------------4664151417711");

        conn.setRequestProperty("Content-Length", String.valueOf((message1
                .length() + message2.length() + byteData.length)));

        os = conn.getOutputStream();

        os.write(message1.getBytes());

        int index = 0;
        int size = 1024;
        do
        {
            if ((index + size) > byteData.length)
            {
                size = byteData.length - index;
            }
            os.write(byteData, index, size);
            index += size;
        }
        while (index < byteData.length);

        os.write(message2.getBytes());
        os.flush();

        is = conn.getInputStream();

        char buff = 512;
        int len;
        byte[] data = new byte[buff];
        do
        {
            len = is.read(data);

            if (len > 0)
            {
                System.out.println(new String(data, 0, len));
            }
        }
        while (len > 0);

    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    finally
    {
        try
        {
            os.close();
        }
        catch (Exception e)
        {
        }
        try
        {
            is.close();
        }
        catch (Exception e)
        {
        }
        try
        {
        }
        catch (Exception e)
        {
        }
    }
}

服务器响应

url: http://127.0.0.1/cloudstore/upload.php?filename=tes%27t+.txt.zip
name of file user wants to save as: tes\'t file.txt.zip
actual save name: tes\'t file.txt.zip
Array
(
    [name] => tes't file.txt.zip
    [type] => application/octet-stream
    [tmp_name] => /tmp/phpgYl0QT
    [error] => 0
    [size] => 1274598
)

下面是我的 php 文件 upload.php

<?php 

$target_path = "" . $_GET['filename'];
echo '  name of file user wants to save as: '.$target_path.'<br/>';
if (!file_exists(dirname($target_path))) {
    mkdir(dirname($target_path), 0777, true);
}

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { 
    echo "actual save name: ".basename( $_FILES['uploadedfile']['name'])." <br/>"; 
} else{ 
    echo "There was an error uploading the file, please try again!<br />"; 
}

print_r($_FILES['uploadedfile']);
?> 

什么会导致这个问题,我认为是 php 试图清理输入?我该如何阻止这种情况发生?

最佳答案

按照OP的希望,结束问题。

使用stripslashes()

它有助于取消引用带引号的字符串,这就是原因。

如果需要这样保存,并且如果需要的话,它会将 tes\'t 更改为 tes't

来自manual :

An example use of stripslashes() is when the PHP directive magic_quotes_gpc is on (it was on by default before PHP 5.4), and you aren't inserting this data into a place (such as a database) that requires escaping. For example, if you're simply outputting data straight from an HTML form.

关于java - 将文件上传到服务器保存的文件包含无效字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25416909/

相关文章:

java - apache.commons.fileuploads 一次解析后未解析请求

javascript - 使用 Jquery 单击隐藏的文件上传按钮?

java - int[] 到 List<int> 的类型映射

java - Python 的 str.join 在 Java 中是否有直接的等价物?

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

php - 如何在 CodeIgniter 中将上传的文件(PDF、DOC 等)显示为可下载链接

java - 我可以在java中将一维数组存储到二维数组中吗?

java - 两个项目中的一个类和序列化java

PHP include 内部变量

javascript - 如何获取具有 multiple 属性的 &lt;input type ="file"> 输入中的所有文件的名称?