我创建了一些代码来处理从java客户端到php服务器的基本文件上传,但我在命名和目录创建方面遇到了一些问题。以下是代码的重要部分:
我用来上传文件的方法:
public static void uploadWithInfo(Uri uri, String title, String artist, String description) {
try {
String path = uri.getPath();
File file = new File(path);
URL url = new URL("http://**********/upload.php?title="+title+"&artist="+artist+"&description="+description);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
OutputStream os = connection.getOutputStream();
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
int totalbytes = bis.available();
for(int i = 0; i < totalbytes; i++) {
os.write(bis.read());
}
os.close();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String serverResponse = "";
String response = "";
while((response = reader.readLine()) != null) {
serverResponse = serverResponse + response;
}
reader.close();
bis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
它只是上传一个音频文件。如有必要,用户输入艺术家,标题和非常简短的描述。实际的文件上传得很好,所以我认为不再需要java了。这是php端的代码:
<?php
$uploadBase = "music/";
$uploadFolder = $_GET['artist']+"/";
$uploadFileName = $_GET['title'];
$uploadFileDescription = $_GET['description'];
$uploadPath = $uploadBase.$uploadFolder.$uploadFileName."%%D%%=".$uploadFileDescription.".mp3";
if(!is_dir($uploadBase)) {
mkdir($uploadBase);
}
if(!is_dir($uploadFolder)) {
mkdir($uploadFolder);
}
$incomingData = file_get_contents('php://input');
if(!$incomingData) {
die("No data.");
}
$fh = fopen($uploadPath, 'w') or die("Error opening path.");
fwrite($fh, $incomingData) or die("Error writing file.");
fclose($fh) or die("Error closing shop.");
echo "Success!";
?>
因此,我获得了标题,艺术家和描述的所有输入值。然后我创建2个目录,如果它们尚不存在:一个用于音乐,另一个用于艺术家的上传器输入。然后我创建一个基(音乐)/文件夹(艺术家)/文件名(标题)“代码让我解析描述”的路径(%% D %%)。mp3。
所以迈克尔·杰克逊的一首歌Billie Jean以及“喜欢”的描述应该有一条
的路径 music/Michael Jackson/Billie%20Jean%%D%%favorite.mp3
然而,我得到的是:
music/0Billie%%D%%=
未创建艺术家的目录,标题前面有一个奇怪的0(仅包含第一个单词),并且描述没有显示。
我真的不知道哪里出错了,有人能给我一些见解吗?谢谢。
答案 0 :(得分:0)
您的InputStream.available()方法没有达到预期效果。请改用文件大小。
编辑:请改为使用多部分上传。 Apache HttpClient支持它,谷歌为examples。
答案 1 :(得分:0)
原来这是一个与一些相关的PHP代码的愚蠢错误。很抱歉给大家带来麻烦。