Android-如何将文件名添加到调用PHP文件的上载文件函数中
我的Android应用程序中有以下Java代码-在扩展Android-如何将文件名添加到调用PHP文件的上载文件函数中,php,android,json,image,file-upload,Php,Android,Json,Image,File Upload,我的Android应用程序中有以下Java代码-在扩展应用程序的Java类中: public static void XSUploadFile(final String filePath, final String fileName, final Activity act, final XSFileHandler handler) { new Thread(new Runnable() { public void run() { upload
应用程序的Java类中
:
public static void XSUploadFile(final String filePath, final String fileName, final Activity act, final XSFileHandler handler) {
new Thread(new Runnable() {
public void run() {
upload(filePath, fileName, act, handler);
}
}).start();
}
public interface XSFileHandler { void done(String fileURL, String error); }
public static void upload(String sourceFileUri, String fileName, Activity act, final XSFileHandler handler) {
HttpURLConnection conn;
DataOutputStream dos;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
final int code;
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1024*1024;
File sourceFile = new File(sourceFileUri);
try {
FileInputStream fileInputStream = new FileInputStream(sourceFile);
URL url = new URL(DATABASE_PATH + "upload-file.php");
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true); // Allow Inputs
conn.setDoOutput(true); // Allow Outputs
conn.setUseCaches(false); // Don't use a Cached Copy
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("ENCTYPE", "multipart/form-data");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
conn.setRequestProperty("file", sourceFileUri);
dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name='file';fileName='" + sourceFileUri + "'" + fileName + "\"" + lineEnd);
dos.writeBytes(lineEnd);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
dos.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
code = conn.getResponseCode();
if (code == HttpURLConnection.HTTP_OK) {
final HttpURLConnection finalConn = conn;
act.runOnUiThread(new Runnable() {
public void run() {
InputStream responseStream = null;
try {
responseStream = new BufferedInputStream(finalConn.getInputStream());
BufferedReader responseStreamReader = new BufferedReader(new InputStreamReader(responseStream));
String line;
StringBuilder stringBuilder = new StringBuilder();
int i = 0;
while ((line = responseStreamReader.readLine()) != null) {
if (i != 0) { stringBuilder.append("\n"); }
stringBuilder.append(line);
i++;
}
responseStreamReader.close();
String response = stringBuilder.toString();
responseStream.close();
finalConn.disconnect();
// Log.i(TAG, "XSUploadFile -> " + response);
if (response != null) { handler.done(DATABASE_PATH + response, null);
} else { handler.done(null, E_401); }
// error
} catch (IOException e) { e.printStackTrace(); handler.done(null, XS_ERROR); }
}});
// Bad response from sever
} else {
act.runOnUiThread(new Runnable() {
public void run() { handler.done(null, XS_ERROR); }});
}
fileInputStream.close();
dos.flush();
dos.close();
// No response from server
} catch (final Exception ex) {
act.runOnUiThread(new Runnable() {
public void run() { handler.done(null, XS_ERROR); }});
}
}
我这样称呼它:
// Get demo image path
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.demo_img);
final String filePath = getRealPathFromURI(getImageUri(bmp, ctx), ctx);
XSUploadFile(filePath, "image.jpg", (Activity)ctx, new XServerSDK.XSFileHandler() {
@Override
public void done(String fileURL, String e) {
if (fileURL != null) {
hideHUD();
Log.i("log-", "Uploaded FileURL: " + fileURL);
}
}});
这是我的上传文件.php
脚本:
<?php include '_config.php';
if ($_FILES["file"]["error"] > 0) {
echo "Error: " .$_FILES["file"]["error"]. "<br>";
} else {
// Check file size
if ($_FILES["file"]["size"] > 20485760) { // 20 MB
echo "ERROR: Your file is larger than 20 MB. Please upload a smaller one.";
} else { uploadImage(); }
}// ./ If
// UPLOAD IMAGE ------------------------------------------
function uploadImage() {
// generate a unique random string
$randomStr = generateRandomString();
$filePath = "uploads/".$randomStr;
// upload image into the 'uploads' folder
move_uploaded_file($_FILES['file']['tmp_name'], $filePath);
// echo the link of the uploaded image
echo $filePath;
}
// GENERATE A RANDOM STRING ---------------------------------------
function generateRandomString() {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i<20; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString."_".$_POST['fileName'];
}
?>
我需要做的是将“image.jpg”附加到该URL的末尾,因此最终结果应该如下所示:
Uploaded FileURL: https://xscoder.com/xserver/uploads/mocpWfxIvtRAacnk1lTV_image.jpg
我假设可以在java类中的XSUploadFile()函数中完成,也许可以编辑以下行:
dos.writeBytes("Content-Disposition: form-data; name='file';fileName='" + sourceFileUri + "'" + fileName + "\"" + lineEnd);
我试过几次剪辑,但都没有成功
请注意,我无法编辑PHP脚本,我有一个PHP和iOS SDK,它们都调用该脚本并工作正常,因此我必须只编辑Android Java代码。您需要从上传的文件中获取扩展名。请参阅下面的代码
$filename = $_FILES["file"]["name"];
$file_extension = end((explode(".", $filename)));
$filePath = 'uploads/' . $randomStr.$file_extension;
move_uploaded_file($_FILES["file"]["tmp_name"], $filePath);
编辑
@xscoder无法编辑php,因此我在java中提供了一个函数,当您将文件名传递给该函数时,该函数将返回文件扩展名
private static String getFileExtension(String fileName) {
if(fileName.lastIndexOf(".") != -1 && fileName.lastIndexOf(".") != 0)
return fileName.substring(fileName.lastIndexOf(".")+1);
else return "";
}
您可以将此行编辑为
dos.writeBytes("Content-Disposition: form-data; name='file';fileName='" + sourceFileUri + "'" + fileName +"."+ getFileExtension(fileName) +"\"" + lineEnd);
注意:在java中使用文件时,需要包括这一行
import java.io.file代码>我从我的Swift代码中获得灵感,找到了一个解决方案,我必须在我的上传功能中添加此代码:
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"fileName\"\r\n\r\n" +
fileName + "\r\n" +
"--" + boundary + "\r\n" +
"Content-Disposition: form-data; name=\"file\"; filename=\"file\"\r\n"
);
最后一个Java函数如下所示:
public static void upload(String sourceFileUri, String fileName, Activity act, final XSFileHandler handler) {
HttpURLConnection conn;
DataOutputStream dos;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
final int code;
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1024*1024;
File sourceFile = new File(sourceFileUri);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
try {
FileInputStream fileInputStream = new FileInputStream(sourceFile);
URL url = new URL(DATABASE_PATH + "upload-file.php");
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("ENCTYPE", "multipart/form-data");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
conn.setRequestProperty("file", sourceFileUri);
dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(twoHyphens + boundary + lineEnd);
/* HERE'S THE MAGIC CODE :) */
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"fileName\"\r\n\r\n" +
fileName + "\r\n" +
"--" + boundary + "\r\n" +
"Content-Disposition: form-data; name=\"file\"; filename=\"file\"\r\n"
);
dos.writeBytes(lineEnd);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
dos.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
code = conn.getResponseCode();
if (code == HttpURLConnection.HTTP_OK) {
final HttpURLConnection finalConn = conn;
act.runOnUiThread(new Runnable() {
public void run() {
InputStream responseStream = null;
try {
responseStream = new BufferedInputStream(finalConn.getInputStream());
BufferedReader responseStreamReader = new BufferedReader(new InputStreamReader(responseStream));
String line;
StringBuilder stringBuilder = new StringBuilder();
int i = 0;
while ((line = responseStreamReader.readLine()) != null) {
if (i != 0) { stringBuilder.append("\n"); }
stringBuilder.append(line);
i++;
}
responseStreamReader.close();
String response = stringBuilder.toString();
responseStream.close();
finalConn.disconnect();
// Log.i(TAG, "XSUploadFile -> " + response);
if (response != null) { handler.done(DATABASE_PATH + response, null);
} else { handler.done(null, E_401); }
// error
} catch (IOException e) { e.printStackTrace(); handler.done(null, XS_ERROR); }
}});
// Bad response from sever
} else { act.runOnUiThread(new Runnable() {
public void run() { handler.done(null, XS_ERROR); }}); }
fileInputStream.close();
dos.flush();
dos.close();
// No response from server
} catch (final Exception ex) {
act.runOnUiThread(new Runnable() {
public void run() { handler.done(null, XS_ERROR); }});
}
}
请找到下面的答案。谢谢,我编辑了我的问题,没有扩展名ios如何显示图像?谢谢,但我不能编辑我的php脚本,我忘了在我的问题中提到它,因为我还有一个php和ios SDK,可以按原样调用该文件,并且工作正常,所以我必须编辑我的Java代码only@xscoder没有扩展ios如何显示图像?因为在类似的Swift函数中,我使用的是:body.append(\(文件名)\r\n.data(使用:String.Encoding.utf8)!
和if fileName.hasSuffix(.jpg){body.append(“内容类型:image/png\r\n\r\n.data(使用:String.Encoding.utf8)!)
。因此,我的http请求发送文件数据+文件名字符串,完整的文件名变为randomChars\u image.jpg
。我必须做与我的Android代码类似的工作well@xscoder在php文件中上传的扩展名是什么?主要是jpg、png和mp4,但我可以上传任何文件,因为我附加了文件名和扩展名从我的代码。
public static void upload(String sourceFileUri, String fileName, Activity act, final XSFileHandler handler) {
HttpURLConnection conn;
DataOutputStream dos;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
final int code;
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1024*1024;
File sourceFile = new File(sourceFileUri);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
try {
FileInputStream fileInputStream = new FileInputStream(sourceFile);
URL url = new URL(DATABASE_PATH + "upload-file.php");
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("ENCTYPE", "multipart/form-data");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
conn.setRequestProperty("file", sourceFileUri);
dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(twoHyphens + boundary + lineEnd);
/* HERE'S THE MAGIC CODE :) */
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"fileName\"\r\n\r\n" +
fileName + "\r\n" +
"--" + boundary + "\r\n" +
"Content-Disposition: form-data; name=\"file\"; filename=\"file\"\r\n"
);
dos.writeBytes(lineEnd);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
dos.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
code = conn.getResponseCode();
if (code == HttpURLConnection.HTTP_OK) {
final HttpURLConnection finalConn = conn;
act.runOnUiThread(new Runnable() {
public void run() {
InputStream responseStream = null;
try {
responseStream = new BufferedInputStream(finalConn.getInputStream());
BufferedReader responseStreamReader = new BufferedReader(new InputStreamReader(responseStream));
String line;
StringBuilder stringBuilder = new StringBuilder();
int i = 0;
while ((line = responseStreamReader.readLine()) != null) {
if (i != 0) { stringBuilder.append("\n"); }
stringBuilder.append(line);
i++;
}
responseStreamReader.close();
String response = stringBuilder.toString();
responseStream.close();
finalConn.disconnect();
// Log.i(TAG, "XSUploadFile -> " + response);
if (response != null) { handler.done(DATABASE_PATH + response, null);
} else { handler.done(null, E_401); }
// error
} catch (IOException e) { e.printStackTrace(); handler.done(null, XS_ERROR); }
}});
// Bad response from sever
} else { act.runOnUiThread(new Runnable() {
public void run() { handler.done(null, XS_ERROR); }}); }
fileInputStream.close();
dos.flush();
dos.close();
// No response from server
} catch (final Exception ex) {
act.runOnUiThread(new Runnable() {
public void run() { handler.done(null, XS_ERROR); }});
}
}