2013-12-10 15 views
14

Projemde, android cihazdan sunucu siteye alınmış bir görüntüyü diske depolanması gereken yere göndermem gerekiyor. Cihaz sitesinde yöntemini çağırdığınızda yazık ki, bu hatayı karşılamak:Güncelleme kullanılarak sunucuda dosya yükleme

@Multipart 
@POST("/monument/photo/upload") 
void addMonumentPhoto(@Part("MonumentID") int monumentId, 
         @Part("name") String name, 
         @Part("subscript") String subscript, 
         @Part("photo") TypedFile photo, 
         Callback<Photo> callback); 

yöntemin ilanıdır

DEBUG/Retrofit(4429): java.lang.RuntimeException: 
    Unable to write multipart request. 
at retrofit.mime.MultipartTypedOutput.buildPart(MultipartTypedOutput.java:86) 
at retrofit.mime.MultipartTypedOutput.addPart(MultipartTypedOutput.java:49) 
at retrofit.RequestBuilder.setArguments(RequestBuilder.java:211) 
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:264) 
at retrofit.RestAdapter$RestHandler.access$500(RestAdapter.java:197) 
at retrofit.RestAdapter$RestHandler$1.obtainResponse(RestAdapter.java:243) 
at retrofit.CallbackRunnable.run(CallbackRunnable.java:38) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
at retrofit.Platform$Android$2$1.run(Platform.java:134) 
at java.lang.Thread.run(Thread.java:856) 

Caused by: java.io.FileNotFoundException: /external/images/media/1270: 
    open failed: ENOENT (No such file or directory) 
at libcore.io.IoBridge.open(IoBridge.java:416) 
at java.io.FileInputStream.<init>(FileInputStream.java:78) 
at retrofit.mime.TypedFile.writeTo(TypedFile.java:74) 
at retrofit.mime.MultipartTypedOutput.buildPart(MultipartTypedOutput.java:83) 
... 10 more 

Caused by: libcore.io.ErrnoException: 
    open failed: ENOENT (No such file or directory) 
at libcore.io.Posix.open(Native Method) 
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 
at libcore.io.IoBridge.open(IoBridge.java:400) 
... 13 more 

... ve ben onu aramak nasıl

photo = new File(selectedImageUri.getPath()); 
typedFile = new TypedFile("application/octet-stream", photo); 
MonumentsUtil.getApi().addMonumentPhoto(monument.getIdZabytek(), 
     "podpis", 
     "Main photo", 
     typedFile, 
     new Callback<Photo>() { 
    @Override 
    public void success(Photo aPhoto, Response response) { 
    } 

    @Override 
    public void failure(RetrofitError retrofitError) { 
     Log.e(TAG, retrofitError.getMessage()); 
    } 
}); 

@RequestMapping(value="/monument/photo/upload", method=RequestMethod.POST) 
public @ResponseBody Photo requestMonumentPhotoAdd(
     @RequestParam("MonumentID") int monumentId, 
     @RequestParam("name") String name , 
     @RequestParam("subscript") String subscript, 
     @RequestParam("photo") org.springframework.web.multipart.MultipartFile file) { 

    Photo photo = new Photo(); 
    photo.setIdZabytek(monumentId); 
    photo.setUri(URL+ "/images/" + name); 
    photo.setPodpis(subscript); 
    photo = monumentsRepo.addPhoto(photo); 
    String filePath = "D:\\Projekty\\Images\\" + monumentId + ":" + photo.getIdZjecia(); 

    if (!file.isEmpty()) { 
     try { 
      byte[] bytes = file.getBytes(); 
      BufferedOutputStream stream = new BufferedOutputStream(
       new FileOutputStream(new File(filePath))); 
      stream.write(bytes); 
      stream.close(); 
      photo.setUri(filePath); 
      monumentsRepo.updatePhoto(photo); 
      return photo; 
     } catch (Exception e) { 
      return null; 
     } 
    } else { 
     return null; 
    } 
} 
: sunucunun sitesinde böyle yöntemler var

Program hata bloğuna gider ve nedenini bilmiyorum. Hataya işaret eden ve neyin yanlış olduğunu açıklayan var mı?

DÜZENLEME

sonraki ben düzeltemez hata var benim kodunda düzeltilmesinden sonra

:

java.net.ProtocolException: content-length promised 1431984 bytes, but received 0  
    com.squareup.okhttp.internal.http.RetryableOutputStream.close(RetryableOutputStream.java:52), 
    com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:629), 
    com.squareup.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java: 346), 
    com.squareup.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:295), 
    com.squareup.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:489), 
retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:90), 
retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:48), 
retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:287), 
retrofit.RestAdapter$RestHandler.access$500(RestAdapter.java:197), 
retrofit.RestAdapter$RestHandler$1.obtainResponse(RestAdapter.java:243), 
retrofit.CallbackRunnable.run(CallbackRunnable.java:38), 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076), 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569), 
retrofit.Platform$Android$2$1.run(Platform.java:134), 
java.lang.Thread.run(Thread.java:856) 

ve HTTP Yanıtı

HTTP/1.1 400 Bad Request, 
Connection: close, 
Content-Length: 1068, 
Content-Type:  text/html;charset=utf-8, 
Date: Wed, 11 Dec 2013 16:45:39 GMT, 
OkHttp-Received-Millis: 1386780339873, 
OkHttp-Response-Source: NETWORK 400, 
OkHttp-Selected-Transport: http/1.1, 
OkHttp-Sent-Millis: 1386780339799, Server: Apache-Coyote/1.1 

Bence sunucunun yöntem yanlış yazılmış olabilir ama emin değilim. Herkes yardım edebilir mi?

+0

Bu sorun çözüldü mü? – dannyroa

cevap

9

Uri#getPathUri yol bileşenini değil dosya sistemi üzerinde yol döndürür. Gerçek görüntü için içerik sağlayıcıyı sorgulamanız gerekir. Buna benzer bir şey: https://stackoverflow.com/a/20186918/132047

+0

Düzeltme işleminden sonra başka bir hatayla karşılaşıyorum. Sunucunun sitesinde yeni stackTrace güçlendirme ve son nokta yöntemini eklemek için yukarıdaki yayını düzenledim. Ne yapıyorum yanlış? –

+0

İstisnadan daha fazlasını (yani, neden parçasını) eklemeniz gerekir. Bu libcore'da derin, bu yüzden tamir edemeyebilirsiniz. Daha iyi bir HTTP istemcisi için OkHttp jar/bağımlılığını uygulamanıza bırakın. –

+0

Kavanoz eklendi ve yeni stackTrace yukarıda yer aldı. Lütfen, bu kodun neden çalışmadığını açıklayan var mı? Güçlendirme, başlığın içerik uzunluğunu ayarlayamadı gibi görünüyor –