android - Httpurlconnection上传文件触发网络丢失重置或恢复
问题描述
当我使用 Android 将视频上传到服务器 (Vimeo) 时,一切正常。
但是在上传过程中,如果我失去了网络连接,我无法从 DataOutputStream 触发 .write I/O 异常。所以我的应用程序冻结了。
如何触发异常以恢复或重置我的上传?
我的 try/catch 没有触发异常……</p>
这是我的代码:
private void call_for_ticket(String upload_url, String complet_uri, String videoUri) {
HttpURLConnection conn = null;
DataOutputStream dos = null;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1 * 1024 * 1024;
File sourceFile = new File(videoUri);
if (sourceFile.isFile())
{
try
{
// open a URL connection to the Servlet
FileInputStream fileInputStream = new FileInputStream(
sourceFile);
URL url = new URL(upload_url);
// Open a HTTP connection to the URL
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("PUT");
conn.setRequestProperty("Authorization",Aurtorizartion);
conn.setRequestProperty("Accept",accept);
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "video/mp4");
conn.setChunkedStreamingMode(-1);
try {
dos = new DataOutputStream(conn.getOutputStream());
// create a buffer of maximum size
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// read file and write it into form...
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
long bytesAvailableReadIncrementation = 0;
long totalFileSize = bytesAvailable;
try{
while (bytesRead > 0) {
dos.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math
.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0,
bufferSize);
bytesAvailableReadIncrementation += bytesRead;
publishProgress("" + (long) ((bytesAvailableReadIncrementation * 100) / totalFileSize));
}
} catch (IOException e) {
Log.d("VMA", "lost connection");
e.printStackTrace();
}
// send multipart form data necesssary after file
// data...
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens
+ lineEnd);
int serverResponseCode;
// Responses from the server (code and message)
serverResponseCode = conn.getResponseCode();
String serverResponseMessage = conn
.getResponseMessage();
// close the streams //
fileInputStream.close();
dos.flush();
dos.close();
if (serverResponseCode == 200) {
call_complete_uri(complet_uri);
}
}
catch (IOException e)
{
Log.d("VMA", "lost connection");
e.printStackTrace();
}
} catch (IOException e) {
Log.d("VMA", "lost connection");
e.printStackTrace();
}
}
}
解决方案
好的,所以我想通了。
我正在模拟器上测试我的代码。在真实设备上,抛出异常:)。
推荐阅读
- javascript - Flask:POST许多输入字段
- php - 使用 PDO 将 MySQL 表行移动到另一个表
- amazon-web-services - 无法从 AWS 海王星上的读取器端点读取
- powerbi - 在 PowerBI 中将持续时间格式化为 hh:mm:ss 可重用
- python - Pandas,如何将列值从整数转换为预定义的字符串值
- gnu - GLPK #glpsol #TSP #读取数据
- c# - 引用实体框架标准 DLL 的 C# dotnet Core 项目
- python - 如何在pybind11中将已经绑定的类作为参数传递?
- reactjs - 如何使用功能组件使用导航 - 反应原生
- python - 数值求解 Friedmann-Lemâitre 方程时的问题