यह उत्तर रेट्रोफिट 1 के लिए है। समाधान के लिए रेट्रोफिट 2 see this answer के साथ संगत समाधान के लिए।
मुझे एक ही समस्या थी और अंततः इसे करने में कामयाब रहा। मैं स्प्रिंग लिब का उपयोग कर रहा था और जो मैंने नीचे दिखाया है वह स्प्रिंग के लिए काम करता है लेकिन असंगत था क्योंकि मैंने इनपुटस्ट्रीम के लिए इसका इस्तेमाल करने में गलती की थी। मैंने रीट्रोफिट का उपयोग करने के लिए अपने सभी एपीआई को स्थानांतरित कर दिया और अपलोड सूची में आखिरी वाला था, मैं आउटपुटस्ट्रीम को पढ़ने वाले बाइट्स पर अपडेट करने के लिए टाइपेडफाइल लिखने के लिए ओवरराइड करता हूं। शायद यह सुधार किया जा सकता है लेकिन जैसा कि मैंने कहा था कि जब मैं वसंत का उपयोग कर रहा था तो मैंने इसे बनाया ताकि मैंने इसका पुन: उपयोग किया। यह अपलोड करने के लिए कोड है और यह मेरे ऐप पर मेरे लिए काम कर रहा है, अगर आप फीडबैक डाउनलोड करना चाहते हैं तो आप @Streaming का उपयोग कर सकते हैं और इनपुटस्ट्रीम पढ़ सकते हैं।
ProgressListener
public interface ProgressListener {
void transferred(long num);
}
CountingTypedFile
public class CountingTypedFile extends TypedFile {
private static final int BUFFER_SIZE = 4096;
private final ProgressListener listener;
public CountingTypedFile(String mimeType, File file, ProgressListener listener) {
super(mimeType, file);
this.listener = listener;
}
@Override public void writeTo(OutputStream out) throws IOException {
byte[] buffer = new byte[BUFFER_SIZE];
FileInputStream in = new FileInputStream(super.file());
long total = 0;
try {
int read;
while ((read = in.read(buffer)) != -1) {
total += read;
this.listener.transferred(total);
out.write(buffer, 0, read);
}
} finally {
in.close();
}
}
}
MyApiService
public interface MyApiService {
@Multipart
@POST("/files")
ApiResult uploadFile(@Part("file") TypedFile resource, @Query("path") String path);
}
SendFileTask
private class SendFileTask extends AsyncTask<String, Integer, ApiResult> {
private ProgressListener listener;
private String filePath;
private FileType fileType;
public SendFileTask(String filePath, FileType fileType) {
this.filePath = filePath;
this.fileType = fileType;
}
@Override
protected ApiResult doInBackground(String... params) {
File file = new File(filePath);
totalSize = file.length();
Logger.d("Upload FileSize[%d]", totalSize);
listener = new ProgressListener() {
@Override
public void transferred(long num) {
publishProgress((int) ((num/(float) totalSize) * 100));
}
};
String _fileType = FileType.VIDEO.equals(fileType) ? "video/mp4" : (FileType.IMAGE.equals(fileType) ? "image/jpeg" : "*/*");
return MyRestAdapter.getService().uploadFile(new CountingTypedFile(_fileType, file, listener), "/Mobile Uploads");
}
@Override
protected void onProgressUpdate(Integer... values) {
Logger.d(String.format("progress[%d]", values[0]));
//do something with values[0], its the percentage so you can easily do
//progressBar.setProgress(values[0]);
}
}
CountingTypedFile सिर्फ TypedFile की एक प्रति लेकिन ProgressListener भी शामिल है।
स्रोत
2014-07-16 04:08:31
आप कर सकते हैं उपयोग के मामले पर विस्तृत? सबसे सरल रेट्रोफिट अनुरोध इतने कम हैं कि प्रगति संकेतकों की आवश्यकता नहीं है, लेकिन मुझे लगता है कि आप एक तस्वीर की तरह फ़ाइल अपलोड करने के लिए PUT या POST का उपयोग कर रहे हैं? – Hober
सटीक रूप से @ हॉबर्ट, क्या आप एक तस्वीर अपलोड करने के लिए रेट्रोफिट का उपयोग न करने की सिफारिश करेंगे? और यदि हां, तो क्या आपके पास कोई सिफारिश है? –
मैंने इसे थोड़ी देर पहले कार्यान्वित किया लेकिन समाधान नहीं मिला, इसलिए मैंने इसके बजाय एक अनिश्चित प्रगति पट्टी बनाई। – NujnaH