0
我想將圖像和歌曲等文件上傳到我的PHP服務器,但是當我嘗試上傳大文件(文件大小5MB或更大)時,我正面臨一些錯誤。我能夠成功上傳500kb附近的文件。請幫我讓我知道,我怎麼能上傳大文件的大小。對於Java文件如何在Android中將大文件上傳到PHP服務器
代碼:
public class UploadAudioDemo extends Activity {
private static final int SELECT_IMAGE = 1, SELECT_AUDIO = 2;
String selectedPath = "";
Button ImageBtn, AudioBtn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageBtn = (Button)findViewById(R.id.image_btn);
AudioBtn = (Button)findViewById(R.id.audio_btn);
ImageBtn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Image"), SELECT_IMAGE);
}
});
AudioBtn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setType("audio/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Audio"), SELECT_AUDIO);
}
});
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == SELECT_IMAGE)
{
System.out.println("SELECT_IMAGE");
Uri selectedImageUri = data.getData();
selectedPath = getPath(selectedImageUri);
System.out.println("SELECT_IMAGE Path : " + selectedPath);
doFileUpload();
}
else if(requestCode == SELECT_AUDIO)
{
System.out.println("SELECT_AUDIO");
Uri selectedImageUri = data.getData();
selectedPath = getPath(selectedImageUri);
System.out.println("SELECT_AUDIO Path : " + selectedPath);
doFileUpload();
}
}
}
public String getPath(Uri uri) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(uri, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
private void doFileUpload(){
HttpURLConnection conn = null;
DataOutputStream dos = null;
DataInputStream inStream = null;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1*1024*1024*1024;
String urlString = "http://abhishekpnf.my3gb.com/test/testupload.php";
try
{
FileInputStream fileInputStream = new FileInputStream(new File(selectedPath));
URL url = new URL(urlString);
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + selectedPath + "\"" + 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);
Log.v("Debug","File is written");
fileInputStream.close();
dos.flush();
dos.close();
}
catch(SocketException ex)
{
Log.v("Error : " , "Error on soapPrimitiveData() " + ex.getMessage());
ex.printStackTrace();
}
catch (MalformedURLException ex)
{
Log.v("Debug", "error: " + ex.getMessage(), ex);
}
catch (IOException ioe)
{
Log.v("Debug", "error: " + ioe.getMessage(), ioe);
}
try {
inStream = new DataInputStream (conn.getInputStream());
String str;
Log.v("Debug","Server Response "+String.valueOf(inStream));
while ((str = inStream.readLine()) != null)
{
Log.v("Debug","Server Response "+str);
Toast.makeText(this, "Status: "+str, Toast.LENGTH_LONG).show();
}
inStream.close();
}
catch (IOException ioex)
{
Log.v("Debug", "error: " + ioex.getMessage(), ioex);
}
}
}
我也包括以下Uses Permissions:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
logcat的:
09-23 12:26:15.676: I/ActivityManager(59): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=pack.coderzheaven/.UploadAudioDemo }
09-23 12:26:15.746: D/AndroidRuntime(522): Shutting down VM
09-23 12:26:15.746: D/dalvikvm(522): Debugger has detached; object registry had 1 entries
09-23 12:26:15.806: I/AndroidRuntime(522): NOTE: attach of thread 'Binder Thread #3' failed
09-23 12:26:21.627: I/ActivityManager(59): Starting activity: Intent { act=android.intent.action.CHOOSER cmp=android/com.android.internal.app.ChooserActivity (has extras) }
09-23 12:26:22.428: I/ActivityManager(59): Displayed activity android/com.android.internal.app.ChooserActivity: 659 ms (total 6698 ms)
09-23 12:26:24.247: I/ActivityManager(59): Starting activity: Intent { act=android.intent.action.GET_CONTENT typ=audio/* flg=0x3000000 cmp=com.android.music/.MusicPicker }
09-23 12:26:24.867: I/ActivityManager(59): Displayed activity com.android.music/.MusicPicker: 599 ms (total 599 ms)
09-23 12:26:27.427: D/AudioSink(34): bufferCount (4) is too small and increased to 12
09-23 12:26:27.652: W/AudioFlinger(34): write blocked for 83 msecs, 98 delayed writes, thread 0xb3d0
09-23 12:26:29.106: W/TimedEventQueue(34): Event 17 was not found in the queue, already cancelled?
09-23 12:26:29.276: I/System.out(507): SELECT_AUDIO
09-23 12:26:29.306: I/System.out(507): SELECT_AUDIO Path : /mnt/sdcard/download/tu_judda.mp3
09-23 12:26:34.986: D/dalvikvm(507): GC_FOR_MALLOC freed 4352 objects/283128 bytes in 110ms
09-23 12:26:35.076: I/dalvikvm-heap(507): Grow heap (frag case) to 7.707MB for 5277339-byte allocation
09-23 12:26:35.256: D/dalvikvm(507): GC_FOR_MALLOC freed 1424 objects/83568 bytes in 173ms
09-23 12:26:35.346: D/dalvikvm(507): GC_FOR_MALLOC freed 42 objects/1888 bytes in 83ms
09-23 12:26:35.516: I/dalvikvm-heap(507): Grow heap (frag case) to 17.693MB for 10554880-byte allocation
09-23 12:26:35.696: D/dalvikvm(507): GC_FOR_MALLOC freed 0 objects/0 bytes in 178ms
09-23 12:26:35.696: V/Debug(507): File is written
09-23 12:26:39.083: W/ActivityManager(59): Launch timeout has expired, giving up wake lock!
09-23 12:26:39.244: W/ActivityManager(59): Activity idle timeout for HistoryRecord{4504efe8 pack.coderzheaven/.UploadAudioDemo}
09-23 12:26:39.809: D/SntpClient(59): request time failed: java.net.SocketException: Address family not supported by protocol
我已經等了25-30分鐘,但屏幕保持不變,也沒有該文件被上傳到服務器...
請幫助..
上SO將提供一些類似的問題。搜索。如[鏈接1](http://stackoverflow.com/questions/10276647/uploading-video-upto-50mb-to-the-server),[鏈接2](http://stackoverflow.com/questions/10838653/android-large-video-uploadloading-to-server),[Link 3](http://stackoverflow.com/questions/5089891/android-video-upload-to-php-server)。前兩個鏈接可能有幫助。 –
@SiddharthLele Link1和Link2都是非常棒的教程,但它們不能解決我的問題。我已經嘗試根據教程修改代碼,但在執行上傳到服務器的文件的大小後是0B。所以請看看我的代碼,並幫助我..謝謝.. –
我只是指着你在正確的方向。我在這方面沒有經驗。 –