2012-12-28 41 views
0

我一直致力于谷歌应用引擎3天后,最后遇到这个问题,我无法解决..很多研究,但可以找到任何有说服力的。 M通过Android上传文件到GAE

设置我的Google app Engine帐户后,当我打电话给我的应用程序url“my-app-id.appspot.com/myservlet”时,GAE上的简单Servlet就能够在Google bucket中写入.txt文件。对于相同的代码片段是在这里:

fetchurl.java 

      DefaultHttpClient hc=new DefaultHttpClient(); 
      ResponseHandler <String> res=new BasicResponseHandler(); 
      HttpGet postMethod=new HttpGet("http://my-app-id.appspot.com/uploadservlet"); 

      String response=hc.execute(postMethod,res); 

uploadservlet.java

An example @ Complete Sample App at this link: 
    https://developers.google.com/appengine/docs/java/googlestorage/overview 

现在我的问题是,当我使用多部贯穿POST方法来发送一些文件,Servlet的@应用程序引擎不工作,并在eclipse中我收到错误消息“Filenotfound”。在Android的侧

urlString = "http://my-app-id.appspot.com/uploadservlet"; 
    URL url = new URL(urlString); 

      // Open a HTTP connection to the URL 
      conn = (HttpURLConnection) url.openConnection(); 
      conn.setConnectTimeout(90000); 

      // Allow Inputs 
      conn.setDoInput(true); 

      // Allow Outputs 
      conn.setDoOutput(true); 

      // Don't use a cached copy. 
      conn.setUseCaches(false); 

      // Use a post method. 
      conn.setRequestMethod("POST"); 

      isOK = true; 

      conn.setRequestProperty("Connection", "Keep-Alive"); 

      conn.setRequestProperty("Content-Type", 
        "multipart/form-data;boundary=" + boundary); 

      DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); 


      dos.writeBytes(twoHyphens + boundary + lineEnd); 
      dos.writeBytes("Content-Disposition: form-data; name=param1;filename=" 
          + param1 + "" + lineEnd); 
      dos.writeBytes(lineEnd); 
      dos.writeBytes(twoHyphens + boundary + lineEnd); 
      Log.e(Tag, "Param1 are written"); 

      dos.writeBytes(twoHyphens + boundary + lineEnd); 
      dos.writeBytes("Content-Disposition: form-data; name=param2;filename=" 
          + param2 + "" + lineEnd); 
      dos.writeBytes(lineEnd); 
      dos.writeBytes(twoHyphens + boundary + lineEnd); 
      Log.e(Tag, "Param2 are written"); 



      FileInputStream fileInputStream = new FileInputStream(new File(
        path)); 
      dos.writeBytes(twoHyphens + boundary + lineEnd); 
      dos.writeBytes("Content-Disposition: form-data; name=uploadedfile;filename=" 
         + path + "" + lineEnd); 
      dos.writeBytes(lineEnd); 

      Log.e(Tag, "Headers are written"); 

      // create a buffer of maximum size 

      int bytesAvailable = fileInputStream.available(); 
      int maxBufferSize = 1000; 
      // int bufferSize = Math.min(bytesAvailable, maxBufferSize); 
      byte[] buffer = new byte[bytesAvailable]; 

      // read file and write it into form... 

      int bytesRead = fileInputStream.read(buffer, 0, bytesAvailable); 

      while (bytesRead > 0) 
      { 
       dos.write(buffer, 0, bytesAvailable); 
       bytesAvailable = fileInputStream.available(); 
       bytesAvailable = Math.min(bytesAvailable, maxBufferSize); 
       bytesRead = fileInputStream.read(buffer, 0, bytesAvailable); 
      } 

      // send multipart form data necesssary after file data... 
      //dos.writeBytes(lineEnd); 
      dos.writeBytes(twoHyphens + boundary + lineEnd); 
      dos.writeBytes(lineEnd); 
      dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

java文件,我想知道,如果这种做法是正确的,甚至。如果不是什么是另一种解决方案..我也看着blobstorage,但它也是这样做的,写文件桶不上传..请帮助我们......任何事情都会很棒,很感谢!

Servlet code to handle file upload and save to Google storage-- 

@MultipartConfig 
@SuppressWarnings("serial") 
    public class SecondtrygoogleServlet extends HttpServlet 
    { 
public static String BUCKETNAME = "androidbucket"; 
public static String FILENAME = "shikhatry.txt"; 

private static final long serialVersionUID = 1L; 


private static final int THRESHOLD_SIZE = 1024 * 1024 * 3; // 3MB 
private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB 
private static final int REQUEST_SIZE = 1024 * 1024 * 50; // 50MB 



public void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException 
{ 
    // checks if the request actually contains upload file 
    if (!ServletFileUpload.isMultipartContent(request)) { 
     // if not, we stop here 
     return; 
    } 

    response.setContentType("text/plain"); 
    response.getWriter().println("Hello, test1 world"); 

    // configures some settings 
    DiskFileItemFactory factory = new DiskFileItemFactory(); 
    factory.setSizeThreshold(THRESHOLD_SIZE); 
    factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); 

    ServletFileUpload upload = new ServletFileUpload(factory); 
    upload.setFileSizeMax(MAX_FILE_SIZE); 
    upload.setSizeMax(REQUEST_SIZE); 
    java.io.PrintWriter out = response.getWriter(); 

    try { 
      // parses the request's content to extract file data 
      List<?> formItems = upload.parseRequest(request); 
      out.println("Number of fields: " + formItems.size()); 
      Iterator<?> iter = formItems.iterator(); 


      // iterates over form's fields 
      while (iter.hasNext()) 
      { 
       out.println("Inside while loop"); 
       FileItem item = (FileItem) iter.next(); 
       // processes only fields that are not form fields 
       if (!item.isFormField()) 
       { 

        String temp = item.getFieldName(); 
        out.println("Parameter Name"+temp); 

        if(temp.equals("uploadedfile")) 
        { 
         String fileName = new File(item.getName()).getName(); 
         FILENAME = fileName+".txt"; 
         out.println("Filename"+fileName); 


         FileService fileService = FileServiceFactory.getFileService(); 
         GSFileOptionsBuilder optionsBuilder = new GSFileOptionsBuilder() 
         .setBucket(BUCKETNAME) 
         .setKey(FILENAME) 
         .setMimeType("text/html") //audio/mp3 text/html 
         .setAcl("public_read") 
         .addUserMetadata("myfield1", "my field value"); 


        AppEngineFile writableFile = 
         fileService.createNewGSFile(optionsBuilder.build()); 

        // Open a channel to write to it 
        boolean lock = false; 
        FileWriteChannel writeChannel = 
         fileService.openWriteChannel(writableFile, lock); 


        // Different standard Java ways of writing to the channel 
        // are possible. Here we use a PrintWriter: 

        InputStream inputStream = item.getInputStream(); 
        int readBytes = 0; 
        byte[] buffer = new byte[10000]; 



        while ((readBytes = inputStream.read(buffer, 0, 10000)) != -1) 
        { 
         writeChannel.write(ByteBuffer.wrap(buffer)); 

        } 

        inputStream.close(); 

        writeChannel.closeFinally(); 
        response.getWriter().println("Done writing..."); 

       } 
       else if(temp.equals("param1")) 
       { 
        out.println("Inside param1"); 
        //String param1Val = new File(item.getName()).getName();       
        //BUCKETNAME = param1Val; 
       } 
       else if(temp.equals("param2")) 
       { 
        out.println("Inside param2"); 
        //String param2Val = new File(item.getName()).getName(); 

        //BUCKETNAME = param2Val; 


       } 
      } 
     } 
     request.setAttribute("message", "Upload has been done successfully!"); 
    } catch (Exception ex) { 
     request.setAttribute("message", "There was an error: " + ex.getMessage()); 
    } 


} 
+0

此外,我试图上传文件在Amazon Bucket S3和Windows Azure上,他们提供了直接的方式来做同样的事情。我正在最困难的时间在Google上弄明白这一点。 –

回答

1

选项包括:

一个。使用createUploadURL以表格上传大文件,或

b。使用你的方法,然后解码解析上传并写入到servlet中的blobstore(文件需要小于32MB),或者

c。使用Google Cloud Storage API直接写入GCS,然后将上传的文件名发布到您的应用程序。

+0

感谢您的回复@ Stuart ..我不能去选择a。因为我无法在我的应用程序中形成..B。我有我自己的方法来解析上传文件...我用它之前..但问题是我的servelt驻留在Appengine没有收到任何文件,当我做HttpURLConnetion(上面描述的方法)... C.Yeah我也读了关于它,我不知道如何使用这个API ...你能给我任何链接,有一些使用API​​的例子??任何帮助将是伟大的..我真的需要这个! –

+0

我也编辑了我的问题:我添加了B选项的servlet代码。 –

+0

请注意,您不需要使用选项A的表单 - 您只需将MIME多部分消息发布到从createUploadURL返回的URL即可。 –